python - 从 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是如何工作的?
以下问题的答案无效:
- 更新熊猫中满足特定条件的行值:从文字中设置值
- 如何有条件地更新 Pandas 中的 DataFrame 列:从文字中设置值
解决方案
这将不起作用,因为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)
推荐阅读
- azure - Azure 管道在 Microsoft Teams 中发布 PR
- excel - 将时间戳从excel转换为matlab
- swift - 使用 init() 方法时传递给不带参数的调用的参数
- mysql - 正则表达式示例与官方文档结果不匹配
- ruby-on-rails - Rails ActionCable - 监听或订阅后台进程
- keras - keras 中的 LSTM 实时预测
- android - 如果在 onRestart() 之后调用 onStart(),是否在 onStart() 之前调用 onCreate()?
- c - FreeRTOS LPUART:从 uart 接收时缺少数据
- stream - HIDDevice 流似乎在 Telegramm / HIDSharp 中找不到正确的条目位置
- caching - Web 缓存是否代表 Web 应用程序分析的问题?