gpt4 book ai didi

python - 将元组列表的拆分列从“应用到新列”

转载 作者:行者123 更新时间:2023-12-01 09:16:54 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

df = pd.DataFrame(
{'tod': [[('a',10),('b',6),('h',3),('p',2)],
[('x',11),('e',2),('l',2)],
[('r',5),('l',5)],
[('n',15)]]})

tod
0 [(a, 10), (b, 6), (h, 3), (p, 2)]
1 [(x, 11), (e, 2), (l, 2)]
2 [(r, 5), (l, 5)]
3 [(n, 15)]

我想将元组列表扩展到新列以获得:

                                 tod l1   n1  l2    n2 l3    n3  l4    n4
0 [(a, 10), (b, 6), (h, 3), (p, 2)] a 10 b 6 h 3 p 2
1 [(x, 11), (e, 2), (l, 2)] x 11 e 2 l 2 - nan
2 [(r, 5), (l, 5)] r 5 l 5 - nan - nan
3 [(n, 15)] n 15 - nan - nan - nan

如果元组不存在,我希望在相应的列中得到缺失值。

我遇到了麻烦,因为每个单元格中每个列表的长度(元组数量)对于每行都不同,所以我想在新列值出现时动态分配它们。此外,每个单元格都包含一个元组对列表,而不是单个元组。

我尝试了类似 this 的内容问题,但这只允许将单个元组扩展到多个列(当您事先知道列时)。

然后我查看了thisthis但同样,列数未知,所以我最终得到:

pd.DataFrame.from_records([{k: v for v, k in row} for row in df.tod])
Out[171]:
2 3 5 6 10 11 15
0 p h NaN b a NaN NaN
1 l NaN NaN NaN NaN x NaN
2 NaN NaN l NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN n

然后我查看了包含元组 here 的拆分单元格和 here它着眼于将元组转换为一系列,但同样,这不起作用,因为这些示例仅处理已知长度的单个元组,而不是元组列表

如何解决这个问题?

注意:我意识到我没有为“你尝试过什么”提供大量代码 - 我的控制台是一堆垃圾,已经产生了连续的错误。为了保持干净,我把它留下了。

最佳答案

您可以展平元组,然后通过生成器创建列名称,最后 join到原始数据框:

#https://stackoverflow.com/a/45122198/2901002
def mygen(lst):
for item in lst:
yield 'l{}'.format(item)
yield 'n{}'.format(item)

df1 = pd.DataFrame([[b for a in row for b in a] for row in df.tod])
df1.columns = list(mygen(range(1, len(df1.columns) // 2 + 1)))
print(df1)
l1 n1 l2 n2 l3 n3 l4 n4
0 a 10 b 6.0 h 3.0 p 2.0
1 x 11 e 2.0 l 2.0 None NaN
2 r 5 l 5.0 None NaN None NaN
3 n 15 None NaN None NaN None NaN

df = df.join(df1)
print (df)
tod l1 n1 l2 n2 l3 n3 l4 n4
0 [(a, 10), (b, 6), (h, 3), (p, 2)] a 10 b 6.0 h 3.0 p 2.0
1 [(x, 11), (e, 2), (l, 2)] x 11 e 2.0 l 2.0 None NaN
2 [(r, 5), (l, 5)] r 5 l 5.0 None NaN None NaN
3 [(n, 15)] n 15 None NaN None NaN None NaN

关于python - 将元组列表的拆分列从“应用到新列”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51169322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com