我有以下df1:
Person Day1 Day2 Day3
1 2 1 1
2 2 0 7
3 4 1 2
然后是另一个df2:
Person Day1 Day2 Day3
1 a b b
2 a c a
3 c b c
因此,这两个数据帧具有相同的索引和列。如何选择df2中仅包含“ c”的df1元素?
结果满足条件时,结果应为df1的值,否则为0:
Person Day1 Day2 Day3
1 0 0 0
2 0 0 0
3 4 0 2
答案 0 :(得分:6)
如果第一列是索引,请使用DataFrame.where
:
df = df1.where(df2.eq('c'), 0)
print (df)
Day1 Day2 Day3
Person
1 0 0 0
2 0 0 0
3 4 0 2
如果第一列不是索引,则一个可能的想法是选择所有没有第一列的列并分配回来:
df1.iloc[:, 1:]= df1.iloc[:, 1:].where(df2.iloc[:, 1:].eq('c'), 0)
print (df1)
Person Day1 Day2 Day3
0 1 0 0 0
1 2 0 0 0
2 3 4 0 2
或者:
df = df1.set_index('Person').where(df2.set_index('Person').eq('c'), 0).reset_index()
print (df)
Person Day1 Day2 Day3
0 1 0 0 0
1 2 0 0 0
2 3 4 0 2
答案 1 :(得分:3)
在@jezrael的帮助下,另一个使用 np.where
的解决方案:
import numpy as np
df = pd.DataFrame(np.where(df2.eq('c'), df1, 0), index=df1.index, columns=df1.columns).reset_index()
输出:
Person Day1 Day2 Day3
0 1 0 0 0
1 2 0 0 0
2 3 4 0 2