我有一个看起来像这样的Pandas DataFrame:
NAME total total_temp
ID
1 CVS [abc1] [cba, xyzzy01]
2 Costco [bcd2, 22] [dcb, xyzzy02]
3 Apple [cde3] [edc, xyzzy03]
我想添加一个新列total_temp_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]
我觉得我可以通过非常低效的方式来串联列表,但我怀疑我遗漏了一些我不了解的关于熊猫的信息。
我如何使用熊猫来完成此操作?
答案 0 :(得分:4)
在处理混合类型时,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:
,请尝试使用yaml
软件包。
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
就简单性而言,这些功能很棒,但由于混合类型操作难以向量化,因此具有固有的循环性。
答案 1 :(得分:1)
在这种情况下(希望将功能应用于数据框,我通常会去.apply()
。因此,我将执行以下操作:
df['total_temp_2'] = df.apply(lambda x: x['total'] + x['total_temp'], axis=1)
对于这种类型的转换,使用内置的熊猫功能是最佳选择。