python - 根据涉及不同字段 + 迭代的条件更新特定数据帧字段
问题描述
我有一个带有月份列和一些分类和数字列的数据框(下面的屏幕截图)。分类列一起形成定义行的键。
我想调整一些数字,例如:
如果 Obj_col3 == XY 和 Month == 2018-12:然后选择 Num_col3 对应的值并乘以 2。
然后将此 Num_col3*2 分配给 Num_col2 但是在月份为 2018-04 的行中,并且分类对象列具有与上述步骤 1 中选择的组合或键相同的组合或键。
- 对您在数据框中看到的每个唯一 obj 组合重复此操作。
输出数据框:
解决方案
想法是MultiIndex
通过DataFrame.set_index
在列中为组创建的,这里Obj_col1
和Obj_col2
,然后按条件设置值,最后reset_index
为原始索引:
print (df)
Obj_col1 Obj_col2 Obj_col3 Num_col1 Num_col2 Num_col3 Month
0 A AB XY 74 40 97 2018-04
1 A AB XY 61 26 29 2018-12
2 A AB XY 50 75 92 2019-03
3 A AB XY 33 99 87 2019-04
4 B AB XY 74 40 7 2018-04
5 B AB XY 61 26 1 2018-12
6 B AB XY 50 75 9 2019-03
7 B AB XY 33 99 8 2019-04
8 C AB XA 74 40 9 2018-04
9 C AB XA 61 26 1 2018-12
10 C AB XA 50 75 92 2019-03
11 C AB XA 33 99 87 2019-04
df = df.set_index(['Obj_col1','Obj_col2'])
m1 = (df['Obj_col3'] == 'XY') & (df['Month'] == '2018-12')
m2 = (df['Obj_col3'] == 'XY') & (df['Month'] == '2018-04')
df.loc[m2, 'Num_col2'] = df.loc[m1, 'Num_col3'] * 1000 # * 2 in real data
df = df.reset_index()
print (df)
Obj_col1 Obj_col2 Obj_col3 Num_col1 Num_col2 Num_col3 Month
0 A AB XY 74 29000 97 2018-04
1 A AB XY 61 26 29 2018-12
2 A AB XY 50 75 92 2019-03
3 A AB XY 33 99 87 2019-04
4 B AB XY 74 1000 7 2018-04
5 B AB XY 61 26 1 2018-12
6 B AB XY 50 75 9 2019-03
7 B AB XY 33 99 8 2019-04
8 C AB XA 74 40 9 2018-04
9 C AB XA 61 26 1 2018-12
10 C AB XA 50 75 92 2019-03
11 C AB XA 33 99 87 2019-04
另一种具有迭代的解决方案,但如果有大量组,则在第一个解决方案中性能更好:
def f(x):
m1 = (x['Obj_col3'] == 'XY') & (x['Month'] == '2018-12')
m2 = (x['Obj_col3'] == 'XY') & (x['Month'] == '2018-04')
x.loc[m2, 'Num_col2'] = (x.loc[m1, 'Num_col3'] * 1000).values
return x
df = df.groupby(['Obj_col1','Obj_col2']).apply(f)
推荐阅读
- typescript - 如何使用 ts 在 vue3 中将 ref 数据定义为类类型
- node.js - 本地 mongodb Node.js 服务器成功进行身份验证,然后在几秒钟后结束连接
- javascript - React Native / Redux - 获取字符串时响应返回为数组
- supervised-learning - 您能否构建一个模型,使用测试集规范化 FEATURES,同时避免数据泄漏?
- debugging - 找出应用程序在哪里等待
- c - 分配给类型“struct ListNode”时的类型不兼容
- javascript - 为什么画布不加载?
- python - 未找到 cyclegan 的列表索引
- c++ - 为什么 co_await 不能返回字符串?
- sql - (SQL) 每个 ID,从第一行开始,返回值 N 大于前一个返回行的所有连续行