通过联接填充数据框Nan值

时间:2019-09-05 18:04:36

标签: python pandas

我正在尝试通过使用两个表df1和df2将所有者映射到IP地址。 df1包含要映射的IP列表,而df2包含IP,别名和所有者。在IP列上运行联接之后,它给了我一半的联接数据帧。可以通过在“别名”列上用联接替换NaN值来联接大多数剩余数据,但是我不知道该怎么做。

我最初的想法是尝试将pd.merge嵌套在fillna()内,但是它不接受数据框。任何帮助将不胜感激。

df1 = pd.DataFrame({'IP' : ['192.18.0.100', '192.18.0.101', '192.18.0.102', '192.18.0.103', '192.18.0.104']})
df2 = pd.DataFrame({'IP' : ['192.18.0.100', '192.18.0.101', '192.18.1.206', '192.18.1.218', '192.18.1.118'],
                    'Alias' : ['192.18.1.214', '192.18.1.243', '192.18.0.102', '192.18.0.103', '192.18.1.180'],
                    'Owner' : ['Smith, Jim', 'Bates, Andrew', 'Kline, Jenny', 'Hale, Fred', 'Harris, Robert']})
new_df = pd.DataFrame(pd.merge(df1, df2[['IP', 'Owner']], on='IP', how= 'left'))

预期输出为:

IP            Owner
192.18.0.100  Smith, Jim
192.18.0.101  Bates, Andrew
192.18.0.102  Kline, Jenny
192.18.0.103  Hale, Fred
192.18.0.104  nan

3 个答案:

答案 0 :(得分:5)

无需合并,只需在条件满足的情况下提取数据即可。这比合并要快得多,而且也很简单。

condition = (df1['IP'] == df2['IP']) | (df1['IP'] == df2['Alias'])
df1['Owner'] = np.where(condition, df2['Owner'], np.nan)
print(df1)
             IP          Owner
0  192.18.0.100     Smith, Jim
1  192.18.0.101  Bates, Andrew
2  192.18.0.102   Kline, Jenny
3  192.18.0.103     Hale, Fred
4  192.18.0.104            NaN

答案 1 :(得分:3)

尝试这个:

new_df = pd.DataFrame(pd.merge(df1, pd.concat([df2[['IP', 'Owner']], df2[['Alias', 'Owner']].rename(columns={"Alias": "IP"})]).drop_duplicates(), on='IP', how= 'left'))

结果:

>>> new_df
             IP          Owner
0  192.18.0.100     Smith, Jim
1  192.18.0.101  Bates, Andrew
2  192.18.0.102   Kline, Jenny
3  192.18.0.103     Hale, Fred
4  192.18.0.104            NaN

答案 2 :(得分:2)

让我们融化然后使用地图:

df1['IP'].map(df2.melt('Owner').set_index('value')['Owner'])

输出:

0       Smith, Jim
1    Bates, Andrew
2     Kline, Jenny
3       Hale, Fred
4              NaN
Name: IP, dtype: object