Python 一种有条件地从DataFrame中同一行的其他值更新新值的方法背后的Pandaic推理
基于同一行中的其他值更新数据帧中的新值的方法背后的pandaic推理是什么 给定Python 一种有条件地从DataFrame中同一行的其他值更新新值的方法背后的Pandaic推理,python,python-3.x,pandas,Python,Python 3.x,Pandas,基于同一行中的其他值更新数据帧中的新值的方法背后的pandaic推理是什么 给定 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) 我试过: 这起作用了 (2) 我还尝试了从其他行值设置值: df.loc[df['b']
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) 我试过:
这起作用了
(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是如何工作的
以下问题的答案无效:
- :从文本设置值
- :从文本设置值
df['c']
,如果定义了,则左侧为数据帧,右侧为序列:
df[df['b'] >= 4] = df['c']
您无法将序列分配给数据帧,并且分配方向错误,因此这将永远不会起作用。但是,正如您所发现的,以下方法有效:
df.loc[df['b'] >= 4, 'c'] = df['a']
这是因为此作业的左侧和右侧都是序列。作为替代方案,您可以使用,您可能会发现更明确的:
df['c'] = np.where(df['b'] >= 4, df['a'], np.nan)
其他可能的方法是使用
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。其中
在不同方法中表现最好:
%timeit df.loc[df['b'] >= 4, 'c'] = df['a']
1000 loops, best of 3: 1.54 ms per loop
你确定是它给了你那个错误吗?当您执行该代码时,还没有列“c”。它应该会引发一个键错误?谢谢。哎呀。在分配未定义的“c”时,我发布了错误的代码。更正上面的内容。在查看下面的回复后,它似乎(1)是最泛泛的,而(3)是最高效的。当您只有两行时,
timeit
不是衡量性能的可靠工具,因为它也会衡量开销。您应该在大型数据集上比较这些方法,您会发现apply实际上是性能最低的方法。我没有测试过它们,但根据我的经验,np.where
在大多数情况下都表现出色。说到熊猫的方式,我会选择df['c']=df['a'].where(df['b']>=4)@user2285236-df['c']=df['a'].where(df['b']>=4)
是表达原意的最自然的方式。谢谢你在大画框上的表演技巧<代码>其中是它所在的“位置”:谢谢你的快速回复。哎呀。在分配未定义的“c”时,我发布了错误的代码。纠正上面的错误。
%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