Python / Pandas条件多列分割(示例代码)

时间:2018-10-26 15:13:46

标签: python pandas dataframe

具有这样的DataFrame:

type  A  B  total
1     4  5   9
2     5  5  10
1     4  1  5

是否可以应用此代码:

df[['A','B']] = df[['A','B']].div(df['total'], axis=0)

BUT基于条件,我的意思是仅在type == 1时应用它,而其他值(type == 2)保持不变,并且不因除法而修改(子集)数据帧吗?

3 个答案:

答案 0 :(得分:2)

您可以使用布尔掩码;实际上,pd.DataFrame.mask在这里起作用:

cond = df['type'].eq(1)

df[['A', 'B']] = df[['A', 'B']].mask(cond, df[['A','B']].div(df['total'], 0))

print(df)

   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5

答案 1 :(得分:1)

我不确定是否由于除法而不修改(子集化)数据框,所以理解了条件,但是我会使用loc语句来实现,仅划分为具有type == 1的行:

df.loc[df['type'].eq(1),['A','B']] = df[['A','B']].div(df['total'], axis=0)

给你

>>> df
   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5

type != 1的值未经修改,但它们是浮点数而不是整数(因为这些列在除法后为dtype浮点数)。如果这不符合您的条件,请在评论中让我知道,我将删除或修改此答案!

答案 2 :(得分:1)

使用update

df.update(df.loc[df.type==1,['A','B']].div(df['total'], axis=0))
df
Out[417]: 
   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5