gpt4 book ai didi

python - 根据列列表转置数据框

转载 作者:行者123 更新时间:2023-12-03 16:29:30 25 4
gpt4 key购买 nike

我有以下结构的数据框:

cNames  | cValues   |  number  
[a,b,c] | [1,2,3] | 10
[a,b,d] | [55,66,77]| 20
我想转置- 从cNames 中的名称创建列。
但是我无法通过转置来实现这一点,因为我想要为列表中的每个值添加一列。
所需的输出:
a   | b   | c   | d   |  number
1 | 2 | 3 | NaN | 10
55 | 66 | NaN | 77 | 20
我怎样才能达到这个结果?
谢谢!
创建DF的代码:
d = {'cNames': [['a','b','c'], ['a','b','d']], 'cValues': [[1,2,3], 
[55,66,77]], 'number': [10,20]}
df = pd.DataFrame(data=d)

最佳答案

一种选择是concat:

pd.concat([pd.Series(x['cValues'], x['cNames'], name=idx) 
for idx, x in df.iterrows()],
axis=1
).T.join(df.iloc[:,2:])
或DataFrame构造:
pd.DataFrame({idx: dict(zip(x['cNames'], x['cValues']) )
for idx, x in df.iterrows()
}).T.join(df.iloc[:,2:])
输出:
      a     b    c     d  number
0 1.0 2.0 3.0 NaN 10
1 55.0 66.0 NaN 77.0 20

更新性能按示例数据的运行时间排序
数据框
%%timeit
pd.DataFrame({idx: dict(zip(x['cNames'], x['cValues']) )
for idx, x in df.iterrows()
}).T.join(df.iloc[:,2:])
1.29 ms ± 36.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
concat :
%%timeit
pd.concat([pd.Series(x['cValues'], x['cNames'], name=idx)
for idx, x in df.iterrows()],
axis=1
).T.join(df.iloc[:,2:])
2.03 ms ± 86.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
KJDII的新系列
%%timeit
df['series'] = df.apply(lambda x: dict(zip(x['cNames'], x['cValues'])), axis=1)
pd.concat([df['number'], df['series'].apply(pd.Series)], axis=1)

2.09 ms ± 65.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
斯科特的apply(pd.Series.explode)
%%timeit
df.apply(pd.Series.explode)\
.set_index(['number', 'cNames'], append=True)['cValues']\
.unstack()\
.reset_index()\
.drop('level_0', axis=1)

4.9 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
wwnde的set_index.apply(爆炸)
%%timeit
g=df.set_index('number').apply(lambda x: x.explode()).reset_index()
g['cValues']=g['cValues'].astype(int)
pd.pivot_table(g, index=["number"],values=["cValues"],columns=["cNames"]).droplevel(0, axis=1).reset_index()

7.27 ms ± 162 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Celius的双重爆炸
%%timeit
df1 = df.explode('cNames').explode('cValues')
df1['cValues'] = pd.to_numeric(df1['cValues'])
df1.pivot_table(columns='cNames',index='number',values='cValues')

9.42 ms ± 189 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - 根据列列表转置数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66070517/

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