问题描述
嘿,我想按列的条件更改行。
所以列“ type” == A
我希望cols [col1-col5]如果值为1 更大2
否则我希望该值为0
the DATA
data={"col1":[np.nan,3,4,5,9,2,6],"col2":[4,6,1,5],"col3":[7,11,7],"col4":[14,22,8,np.nan,9],"col5":[0,7,"type":["A","A","C","B","E"],"number":["one","two","one","two"]}
df=pd.DataFrame.from_dict(data)
df
我期望数据如何
data={"col1":[0,"col2":[1,"col3":[1,"col4":[1,"two"]}
df=pd.DataFrame.from_dict(data)
df
解决方法
您可以使用df.query
获取所有type
A
行,然后使用df._get_numeric_data
/ df.select_dtypes
('number'
)获取所有数字字段,然后使用df.gt
并使用df.astype
将它们强制转换为int,现在使用df.update
df.update(df.query('type == "A"')._get_numeric_data().gt(2).astype(int))
#.select_dtypes('number')
df
col1 col2 col3 col4 col5 type number
0 0.0 1.0 1.0 1.0 0.0 A one
1 1.0 0.0 1.0 1.0 1.0 A two
2 4.0 4.0 0.0 22.0 7.0 C two
3 1.0 1.0 1.0 1.0 1.0 A one
4 9.0 0.0 3.0 6.0 8.0 B one
5 0.0 0.0 1.0 0.0 0.0 A two
6 6.0 5.0 7.0 9.0 9.0 E two
,
使用DataFrame.loc
根据条件A
进行选择,并在第一列和最后一列名称之间进行选择,然后像DataFrame.gt
进行比较,以将True,False
映射到{{1 }}用于将掩码转换为整数,最后由DataFrame.update
更新:
1,0
或通过分配回来:
df.update(df.loc[df['type'].eq('A'),'col1':'col5'].gt(2).astype(int))
print (df)
col1 col2 col3 col4 col5 type number
0 0.0 1.0 1.0 1.0 0.0 A one
1 1.0 0.0 1.0 1.0 1.0 A two
2 4.0 4.0 0.0 22.0 7.0 C two
3 1.0 1.0 1.0 1.0 1.0 A one
4 9.0 0.0 3.0 6.0 8.0 B one
5 0.0 0.0 1.0 0.0 0.0 A two
6 6.0 5.0 7.0 9.0 9.0 E two