gpt4 book ai didi

python - 将一行中的元组转换为 Dataframe 中的新列,必须使用 pandas 0.21

转载 作者:行者123 更新时间:2023-12-04 09:41:10 25 4
gpt4 key购买 nike

我有一个包含元组列表的列,并且想将此元组转换为新列。 ( 注意:必须使用 pandas 0.21;由于我的项目要求,无法升级。 )请参见下面的示例:

df = pd.DataFrame(dict(a=[1,2,3],
b=['a', 'a', 'b'],
c=[[('pear', 1), ('apple', 2)], [('pear', 7), ('orange', 1)], [('apple', 9)] ]))
df

a b c
0 1 a [(pear, 1), (apple, 2)]
1 2 a [(pear, 7), (orange, 1)]
2 3 b [(apple, 9)]
并想将其转换为
    a   b   fruit   value
0 1 a pear 1
1 1 a apple 2
2 2 a pear 7
3 2 a orange 1
4 3 b apple 9
我可以做到,但效率不高,就我而言,我有超过 500K 的行。有没有更有效的方法呢?
更新:
下面提出的所有三个解决方案都非常适合 pandas >=0.25 .对于早期版本 df.explode不是一种选择。对于 pandas < 0.24没有 df.to_numpy所以早期版本的唯一解决方案是@jezreal的解决方案
一个小基准低于 (pandas == 0.25) (令人惊讶的是,explode 更慢):
from itertools import product, chain

def sol_1(df):
phase1 = (product([a],b,c) for a,b,c in df.to_numpy())
phase2 = [(a,b,*c) for a, b, c in chain.from_iterable(phase1)]
return pd.DataFrame(phase2, columns = ["a","b","fruit","value"])


def sol_2(df):
df1 = pd.DataFrame([(k, *x) for k, v in df.c.items() for x in v],
columns=['i','fruit','value'])
df = df.merge(df1, left_index=True, right_on='i').drop('i', axis=1)
return df

def sol_3(df):
df = df.explode('c')
df[['fruit', 'value']] = pd.DataFrame(df['c'].tolist(), index=df.index)
del df['c']
return df

%timeit sol_1(df)
%timeit sol_2(df)
%timeit sol_3(df)

586 µs ± 6.39 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2.8 ms ± 206 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.14 ms ± 28.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

最佳答案

想法是将列表理解中的值 reshape 为新的 DataFrame,然后使用 DataFrame.merge :

df1 = pd.DataFrame([(k, *x) for k, v in df.pop('c').items() for x in v],
columns=['i','fruit','value'])

print (df1)
i fruit value
0 0 pear 1
1 0 apple 2
2 1 pear 7
3 1 orange 1
4 2 apple 9

df = df.merge(df1, left_index=True, right_on='i').drop('i', axis=1)
print (df)
a b fruit value
0 1 a pear 1
1 1 a apple 2
2 2 a pear 7
3 2 a orange 1
4 3 b apple 9

关于python - 将一行中的元组转换为 Dataframe 中的新列,必须使用 pandas 0.21,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62322092/

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