我有一个pandas数据帧,我想创建一个新列,对不同的行组计算不同。这是一个简单的例子:
import pandas as pd
data = {'foo': list('aaade'), 'bar': range(5)}
df = pd.DataFrame(data)
数据框如下所示:
bar foo
0 0 a
1 1 a
2 2 a
3 3 d
4 4 e
现在我要添加一个新列并尝试为选定的行分配一些值:
df['xyz'] = 0
df.loc[(df['foo'] == 'a'), 'xyz'] = df.loc[(df['foo'] == 'a')].apply(lambda x: x['bar'] * 2, axis=1)
数据框架没有改变。我期望的是数据框看起来像这样:
bar foo xyz
0 0 a 0
1 1 a 2
2 2 a 4
3 3 d 0
4 4 e 0
在我的实际问题中,'xyz'列也是针对其他行计算的,但是使用了不同的函数。实际上,我也在使用不同的列进行计算。所以我的问题:
df.loc[(df['foo'] == 'a')
(因为我现在正在做)?答案 0 :(得分:3)
您正在更改df的副本(DataFrame的布尔掩码是副本,请参阅docs)。
实现所需结果的另一种方法如下:
In [11]: df.apply(lambda row: (row['bar']*2 if row['foo'] == 'a' else row['xyz']), axis=1)
Out[11]:
0 0
1 2
2 4
3 0
4 0
dtype: int64
In [12]: df['xyz'] = df.apply(lambda row: (row['bar']*2 if row['foo'] == 'a' else row['xyz']), axis=1)
In [13]: df
Out[13]:
bar foo xyz
0 0 a 0
1 1 a 2
2 2 a 4
3 3 d 0
4 4 e 0
或许更简洁的方式就是:
In [21]: 2 * (df1.bar) * (df1.foo == 'a')
Out[21]:
0 0
1 2
2 4
3 0
4 0
dtype: int64