pandas dataframe基于相应行

时间:2016-10-28 21:43:39

标签: python pandas dataframe

我有一个pandas dataframe

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

对于给定的,如果相应的cde列为 True ,则任何 abc_x 列都应更新为 True AND 至少 相应行的 abc 列之一是 True

结果: vwx 行的 abc_1 变为 True stu abc_6 行仍为 False ,如下所示:

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

似乎,使用 iterrows ,然后通过迭代每列是选项。但是我有几个非常大的数据帧并且正在寻找一种pythonic方法。

2 个答案:

答案 0 :(得分:3)

您可以考虑将列转换为多索引,然后对abccde列执行元素操作:

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))

enter image description here

如果您愿意,可以在以后将多索引连接到一个级别列:

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

enter image description here

答案 1 :(得分:2)

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

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

enter image description here