简体   繁体   中英

pandas dataframe update column values based on other columns of the corresponding row

I have a pandas dataframe as:

Name    abc_1   abc_2   abc_3   abc_4   abc_5   abc_6   cde_1   cde_2   cde_3   cde_4   cde_5   cde_6
 xyz    True    True    False   False   False   True    True    True    False   False   False   False
 stu    False   False   False   False   False   False   False   False   False   False   False   True
 vwx    False   True    False   False   False   False   True    True    False   False   False   False

For a given row , any abc_x column should be updated to True if corresponding cde column is True AND at least one of the abc column of the corresponding row is True .

Result: abc_1 of vwx row becomes True but abc_6 of stu row remains False as below:

Name    abc_1   abc_2   abc_3   abc_4   abc_5   abc_6   cde_1   cde_2   cde_3   cde_4   cde_5   cde_6
 xyz    True    True    False   False   False   False   True    True    False   False   False   False
 stu    False   False   False   False   False   False   False   False   False   False   False   True
 vwx    True    True    False   False   False   False   True    True    False   False   False   False

Seems, using iterrows and then by iterating each column is the option. But I have several and very large dataframes and looking for a pythonic way of doing this.

You can consider transform your columns to multi-index and then perform element wise operation on abc and cde columns:

df.set_index('Name', inplace=True)
df.columns = df.columns.str.split("_", expand = True)
df['abc'] = (df['abc'] | df['cde']).apply(lambda col: col & df['abc'].any(axis=1))

在此处输入图片说明

You can join multi-index to one level column afterwards if you prefer:

df.columns = ["_".join(col) for col in df.columns]

在此处输入图片说明

abc = df.filter(like='abc')
cde = df.filter(like='cde')

df.update((abc | cde.values).__and__(abc.any(1), 0))
df

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM