首页 > 解决方案 > 根据涉及不同字段 + 迭代的条件更新特定数据帧字段

问题描述

我有一个带有月份列和一些分类和数字列的数据框(下面的屏幕截图)。分类列一起形成定义行的键。

我想调整一些数字,例如:

  1. 如果 Obj_col3 == XY 和 Month == 2018-12:然后选择 Num_col3 对应的值并乘以 2。

  2. 然后将此 Num_col3*2 分配给 Num_col2 但是在月份为 2018-04 的行中,并且分类对象列具有与上述步骤 1 中选择的组合或键相同的组合或键。

  3. 对您在数据框中看到的每个唯一 obj 组合重复此操作。

在此处输入图像描述

输出数据框:

在此处输入图像描述

标签: pythonpandas

解决方案


想法是MultiIndex通过DataFrame.set_index在列中为组创建的,这里Obj_col1Obj_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)

推荐阅读