首页 > 解决方案 > 从 DataFrame 的同一行中的其他值有条件地更新新值的方法背后的熊猫推理

问题描述

根据同一行中的其他值更新 DataFrame 中的新值的方法背后的熊猫推理是什么?

给定

df = pd.DataFrame([[1,2],[3,4]], columns=list('ab'))
   a  b  
0  1  2  
1  3  4  

我想

   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

如果“b”> = 4,则“c”列中的值从“a”设置。

(1)我试过:

df['c']=df[df['b']>=4]['a']
   a  b    c
0  1  2  NaN
1  3  4  3.0

这有效。

(2)我还尝试了如何有条件地更新从其他行值设置值的熊猫数据框中的多个列:

df.loc[df['b'] >= 4, 'c'] = df['a']
   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

这有效。

(3) jp还展示了另一种方式:

df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)
   a  b    c  
0  1  2  NaN  
1  3  4  3.0  

这有效。

以上哪一个是最流行的?loc是如何工作的?

以下问题的答案无效:

标签: pythonpython-3.xpandas

解决方案


这将不起作用,因为df['c']未定义,如果是,则左侧是数据框,而右侧是系列:

df[df['b'] >= 4] = df['c']

您不能将系列分配给数据框,并且您的分配方向错误,因此这永远不会起作用。但是,正如您所发现的,以下方法有效:

df.loc[df['b'] >= 4, 'c'] = df['a']

这是因为这个作业的左右都是系列。作为替代方案,您可以使用numpy.where,您可能会发现它更明确:

df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)

推荐阅读