Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一种有条件地从DataFrame中同一行的其他值更新新值的方法背后的Pandaic推理_Python_Python 3.x_Pandas - Fatal编程技术网

Python 一种有条件地从DataFrame中同一行的其他值更新新值的方法背后的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']

基于同一行中的其他值更新数据帧中的新值的方法背后的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'] >= 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