问题:如何根据变量对 df 进行分组,并使用 for 循环进行计算?
任务是根据列中的值进行条件计算。但是计算常数取决于引用列中的值。鉴于此 df:
In [55]: df = pd.DataFrame({
...: 'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
...: 'col2' : [2, 1, 9, 8, 7, 4],
...: 'col3': [0, 1, 9, 4, 2, 3],
...: })
In [56]: df
Out[56]:
col1 col2 col3
0 A 2 0
1 A 1 1
2 B 9 9
3 NaN 8 4
4 D 7 2
5 C 4 3
我已经使用了解决方案 here插入一个 'math' 列,该列从 col3 中获取余额并加 10。但是现在我想遍历一个列表以根据中的值设置计算变量col1。结果如下:
In [57]: items = ['A', 'D']
In [58]: for item in items:
...: df.loc[:, 'math'] = df.loc[df['col1'] == item, 'col3']
...:
In [59]: df
Out[59]:
col1 col2 col3 math
0 A 2 0 NaN
1 A 1 1 NaN
2 B 9 9 NaN
3 NaN 8 4 NaN
4 D 7 2 2.0
5 C 4 3 NaN
明显的问题是 df 在每次迭代时都被覆盖了。索引 0 和 1 的 math 列在第一次迭代中计算出值,但在第二次迭代中将它们移除。生成的 df 只考虑列表的最后一个元素。
我可以通过并添加代码来遍历每个索引值 - 但这似乎比 pythonic 更可悲。
.mul() 示例的预期输出
In [100]: df
Out[100]:
col1 col2 col3 math
0 A 2 0 0.0
1 A 1 1 10.0
2 B 9 9 NaN
3 NaN 8 4 NaN
4 D 7 2 20.0
5 C 4 3 NaN
请您参考如下方法:
您当前方法的问题是每次后续迭代的输出都会覆盖之前迭代的输出。因此,您最终只会得到最后一项的输出,仅此而已。
选择所有包含 items 中元素的行并分配,与之前相同。
df['math'] = df.loc[df.col1.isin(items), 'col3'] * 10
或者,
df['math'] = df.query("col1 in @items").col3 * 10
甚至,
df['math'] = df.col3.where(df.col1.isin(items)) * 10
df
col1 col2 col3 math
0 A 2 0 0.0
1 A 1 1 10.0
2 B 9 9 NaN
3 NaN 8 4 NaN
4 D 7 2 20.0
5 C 4 3 NaN
