基于同一行中的其他值更新数据帧中的新值的方法背后的熊猫推理是什么?
鉴于
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如何工作?
以下答案不起作用:
- 更新熊猫中满足特定条件的行值:从文本设置值
- 如何有条件地更新 Pandas 中的数据帧列:从文本中设置值
其他可能的方法可能是使用apply
:
df['c'] = df.apply(lambda row: row['a'] if row['b'] >=4 else None, axis=1)
print(df)
结果:
a b c
0 1 2 NaN
1 3 4 3.0
比较时间,np.where
似乎在不同的方法中表现最好:
%timeit df.loc[df['b'] >= 4, 'c'] = df['a']
1000 loops, best of 3: 1.54 ms per loop
%timeit df['c']=df[df['b']>=4]['a']
1000 loops, best of 3: 869 µs per loop
%timeit df['c'] = df.apply(lambda row: row['a'] if row['b'] >=4 else None, axis=1)
1000 loops, best of 3: 440 µs per loop
%timeit df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)
1000 loops, best of 3: 359 µs per loop
这不起作用,因为未定义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)