具有这样的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)保持不变,并且不因除法而修改(子集)数据帧吗?
答案 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