搜索和查找从另一个数据框中的一个数据框中搜索值,并根据熊猫中的查找值填充新列

时间:2020-06-17 05:23:51

标签: python pandas dataframe

我有2个数据帧-df1和df2,如下所示。我需要在df1的所有列(列-a至f)中搜索df2 ['Pid']的值,然后创建一个新列df1 ['ind'],该列将随时随地保存df2 ['ind']的值在df1中找到df2 ['Pid']的值之间的匹配。对我来说,它看起来像是一个扩展的查找案例。我使用df2.isin(df1['PERSON_UID'])来标记df1中的值found = true / false,但停留在df1 ['ind']列的创建上。

df1:

a       b       c           d       e       f
0       0       2106        0       0       0
0       2103    0           0       0       0
0       2104    0           0       0       0
0       2105    0           0       0       0
2100    0       0           0       0       0
2101    0       0           0       0       0
2102    0       0           0       0       0
0       0       2107        0       0       0
0       0       2108        0       0       0
0       0       2109        0       0       0
0       0       2110        0       0       0
0       0       2111        0       0       0
0       0       0           2112.   0       0
0       0       0           2113    0       0
0       0       0           2114    0       0
0       0       0           0       2115    0
0       0       0           0       2116    0
0       0       0           0       0       2117
0       0       0           0       0       2118
0       0       0           0       0       2119
0       0       0           0       2120    0

df2:

Pid       ind
2100        y
2101        n
2102        y
2103        n
2104        y
2105        n
2106        n
2107        n
2108        y
2109        y
2110        n
2111        y
2112        y
2113        y
2114        n
2115        n
2116        y
2117        y
2118        n
2119        y
2120        n

所需操作:

a       b       c           d       e       f       ind
0       0       2106        0       0       0       n
0       2103    0           0       0       0       n
0       2104    0           0       0       0       y
0       2105    0           0       0       0       n
2100    0       0           0       0       0       y
2101    0       0           0       0       0       n
2102    0       0           0       0       0       y
0       0       2107        0       0       0       n
0       0       2108        0       0       0       y
0       0       2109        0       0       0       y
0       0       2110        0       0       0       n
0       0       2111        0       0       0       y
0       0       0           2112.   0       0       y
0       0       0           2113    0       0       y
0       0       0           2114    0       0       n
0       0       0           0       2115    0       n
0       0       0           0       2116    0       y
0       0       0           0       0       2117    y
0       0       0           0       0       2118    n
0       0       0           0       0       2119    y
0       0       0           0       2120    0       n

2 个答案:

答案 0 :(得分:2)

@jezrael的答案很完美,如果Pid不是重复的,那么您需要我考虑将它们组合为索引的总和。

df['Pid'] = df.sum(axis=1)
df['Pid'] = df['Pid'].astype(int)
df = pd.merge(df, df2, on='Pid', how='inner')
df.drop('Pid', axis=1, inplace=True)

df
    a   b   c   d   e   f   ind
0   0   0   2106    0.0     0   0   n
1   0   2103    0   0.0     0   0   n
2   0   2104    0   0.0     0   0   y
3   0   2105    0   0.0     0   0   n
4   2100    0   0   0.0     0   0   y
5   2101    0   0   0.0     0   0   n
6   2102    0   0   0.0     0   0   y
7   0   0   2107    0.0     0   0   n
8   0   0   2108    0.0     0   0   y
9   0   0   2109    0.0     0   0   y
10  0   0   2110    0.0     0   0   n
11  0   0   2111    0.0     0   0   y
12  0   0   0   2112.0      0   0   y
13  0   0   0   2113.0      0   0   y
14  0   0   0   2114.0      0   0   n
15  0   0   0   0.0     2115    0   n
16  0   0   0   0.0     2116    0   y
17  0   0   0   0.0     0   2117    y
18  0   0   0   0.0     0   2118    n
19  0   0   0   0.0     0   2119    y
20  0   0   0   0.0     2120    0   n

答案 1 :(得分:1)

使用:

df1['ind'] = df1.mask(df1.eq(0)).ffill(axis=1).iloc[:, -1].map(df2.set_index('Pid')['ind'])
print (df1)
       a     b     c       d     e     f ind
0      0     0  2106     0.0     0     0   n
1      0  2103     0     0.0     0     0   n
2      0  2104     0     0.0     0     0   y
3      0  2105     0     0.0     0     0   n
4   2100     0     0     0.0     0     0   y
5   2101     0     0     0.0     0     0   n
6   2102     0     0     0.0     0     0   y
7      0     0  2107     0.0     0     0   n
8      0     0  2108     0.0     0     0   y
9      0     0  2109     0.0     0     0   y
10     0     0  2110     0.0     0     0   n
11     0     0  2111     0.0     0     0   y
12     0     0     0  2112.0     0     0   y
13     0     0     0  2113.0     0     0   y
14     0     0     0  2114.0     0     0   n
15     0     0     0     0.0  2115     0   n
16     0     0     0     0.0  2116     0   y
17     0     0     0     0.0     0  2117   y
18     0     0     0     0.0     0  2118   n
19     0     0     0     0.0     0  2119   y
20     0     0     0     0.0  2120     0   n

详细信息

首先用DataFrame.mask0值替换为缺失值:

print (df1.mask(df1.eq(0)))
         a       b       c       d       e       f
0      NaN     NaN  2106.0     NaN     NaN     NaN
1      NaN  2103.0     NaN     NaN     NaN     NaN
2      NaN  2104.0     NaN     NaN     NaN     NaN
3      NaN  2105.0     NaN     NaN     NaN     NaN
4   2100.0     NaN     NaN     NaN     NaN     NaN
5   2101.0     NaN     NaN     NaN     NaN     NaN
6   2102.0     NaN     NaN     NaN     NaN     NaN
7      NaN     NaN  2107.0     NaN     NaN     NaN
8      NaN     NaN  2108.0     NaN     NaN     NaN
9      NaN     NaN  2109.0     NaN     NaN     NaN
10     NaN     NaN  2110.0     NaN     NaN     NaN
11     NaN     NaN  2111.0     NaN     NaN     NaN
12     NaN     NaN     NaN  2112.0     NaN     NaN
13     NaN     NaN     NaN  2113.0     NaN     NaN
14     NaN     NaN     NaN  2114.0     NaN     NaN
15     NaN     NaN     NaN     NaN  2115.0     NaN
16     NaN     NaN     NaN     NaN  2116.0     NaN
17     NaN     NaN     NaN     NaN     NaN  2117.0
18     NaN     NaN     NaN     NaN     NaN  2118.0
19     NaN     NaN     NaN     NaN     NaN  2119.0
20     NaN     NaN     NaN     NaN  2120.0     NaN

然后向前填充缺失值:

print (df1.mask(df1.eq(0)).ffill(axis=1))
         a       b       c       d       e       f
0      NaN     NaN  2106.0  2106.0  2106.0  2106.0
1      NaN  2103.0  2103.0  2103.0  2103.0  2103.0
2      NaN  2104.0  2104.0  2104.0  2104.0  2104.0
3      NaN  2105.0  2105.0  2105.0  2105.0  2105.0
4   2100.0  2100.0  2100.0  2100.0  2100.0  2100.0
5   2101.0  2101.0  2101.0  2101.0  2101.0  2101.0
6   2102.0  2102.0  2102.0  2102.0  2102.0  2102.0
7      NaN     NaN  2107.0  2107.0  2107.0  2107.0
8      NaN     NaN  2108.0  2108.0  2108.0  2108.0
9      NaN     NaN  2109.0  2109.0  2109.0  2109.0
10     NaN     NaN  2110.0  2110.0  2110.0  2110.0
11     NaN     NaN  2111.0  2111.0  2111.0  2111.0
12     NaN     NaN     NaN  2112.0  2112.0  2112.0
13     NaN     NaN     NaN  2113.0  2113.0  2113.0
14     NaN     NaN     NaN  2114.0  2114.0  2114.0
15     NaN     NaN     NaN     NaN  2115.0  2115.0
16     NaN     NaN     NaN     NaN  2116.0  2116.0
17     NaN     NaN     NaN     NaN     NaN  2117.0
18     NaN     NaN     NaN     NaN     NaN  2118.0
19     NaN     NaN     NaN     NaN     NaN  2119.0
20     NaN     NaN     NaN     NaN  2120.0  2120.0

使用DataFrame.iloc按位置选择最后一列:

print (df1.mask(df1.eq(0)).ffill(axis=1).iloc[:, -1])
0     2106.0
1     2103.0
2     2104.0
3     2105.0
4     2100.0
5     2101.0
6     2102.0
7     2107.0
8     2108.0
9     2109.0
10    2110.0
11    2111.0
12    2112.0
13    2113.0
14    2114.0
15    2115.0
16    2116.0
17    2117.0
18    2118.0
19    2119.0
20    2120.0
Name: f, dtype: float64

最后一次使用Series.map