将两个填充的列连接到一个大列表中?

2024-05-19 13:32:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,看起来像这样:

     NAME      total           total_temp
ID                                      
1     CVS     [abc1]       [cba, xyzzy01]
2  Costco     [bcd2, 22]   [dcb, xyzzy02]
3   Apple     [cde3]       [edc, xyzzy03]

我想添加并创建一个新的列total\u temp\u 2,以便数据如下所示:

     NAME      total       total_temp                   total_temp_2
ID                                                  
1     CVS     [abc1]       [cba, xyzzy01]       [abc1, cba, xyzzy01]
2  Costco     [bcd2, 22]   [dcb, xyzzy02]   [bcd2, 22, dcb, xyzzy02]
3   Apple     [cde3]       [edc, xyzzy03]       [cde3, edc, xyzzy03]

我觉得我可以通过非常低效的方法来猜出我的方法来连接列表,但是我怀疑我遗漏了一些我不知道的关于熊猫的东西。你知道吗

如何使用熊猫实现此操作?你知道吗


Tags: 数据nameidtempedctotalcvscba
2条回答

在处理混合类型时,I usually recommend using something like a list comprehension,它具有最小的内存和性能开销。你知道吗

df['total_temp_2'] = [x + y for x, y in zip(df['total'], df['total_temp'])]
df

      NAME       total      total_temp              total_temp_2
ID                                                              
1      CVS      [abc1]  [cba, xyzzy01]      [abc1, cba, xyzzy01]
2   Costco  [bcd2, 22]  [dcb, xyzzy02]  [bcd2, 22, dcb, xyzzy02]
3    Apple      [cde3]  [edc, xyzzy03]      [cde3, edc, xyzzy03]

如果这些是字符串列,则可以使用ast.literal_eval来解析它们:

import ast

c = df.select_dtypes(include=[object]).columns
df[c] = df[c].applymap(ast.literal_eval)

如果上面的解决方案抛出ValueError: malformed node or string:,请尝试改用^{}包。你知道吗

import yaml
df = df.applymap(yaml.load)

有趣的是,简单的加法在0.24上对我有效。你知道吗

df['total'] + df['total_temp']

ID
1        [abc1, cba, xyzzy01]
2    [bcd2, 22, dcb, xyzzy02]
3        [cde3, edc, xyzzy03]
dtype: object

这些也有用

df['total'].add(df['total_temp'])

ID
1        [abc1, cba, xyzzy01]
2    [bcd2, 22, dcb, xyzzy02]
3        [cde3, edc, xyzzy03]
dtype: object

df['total_temp'].radd(df['total'])

ID
1        [abc1, cba, xyzzy01]
2    [bcd2, 22, dcb, xyzzy02]
3        [cde3, edc, xyzzy03]
dtype: object

这些操作在简单性方面非常好,但由于混合类型的操作更难矢量化,因此本质上是循环的。你知道吗

在这种情况下(想要将函数应用于数据帧),我通常会转到.apply()。所以我会运行这个:

df['total_temp_2'] = df.apply(lambda x: x['total'] + x['total_temp'], axis=1)

对于这种类型的转换,使用内置功能是最佳的。你知道吗

相关问题 更多 >