pandas将数据框与NaN(或“未知”)合并为缺失值

时间:2015-01-27 16:02:48

标签: python pandas dataframe

我有2个数据帧,其中一个数据帧包含另一个(但不是全部)行的补充信息。

names = df({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank'],
           'classification':['thief','thief','good','thief']})

我想从上面的info数据框中获取分类列,并将其添加到上面的names数据框中。但是,当我执行combined = pd.merge(names, info)时,结果数据帧只有4行长。所有没有补充信息的行都将被删除。

理想情况下,我会将缺失列中的值设置为unknown。导致数据框中有些人是有效的,有些是好的,其余的是未知的。

编辑: 我收到的第一个答案之一建议使用合并outter,这似乎做了一些奇怪的事情。这是一个代码示例:

names = df({'names':['bob','frank','bob','bob','bob''james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','dev','dev','dev''sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank','joe','bill'],
           'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna("unknown")

奇怪的是,在输出中我会得到一行,结果名称是“bobjames”,另一行是“devsys”。最后,即使bill没有出现在名称数据框中,它也会显示在结果数据框中。所以我真的需要一种方法来说明在这个其他数据框中查找一个值,如果你在这些列上发现了什么东西。

4 个答案:

答案 0 :(得分:15)

如果您仍在寻找答案:

"奇怪"您描述的内容是由于代码中的一些小错误造成的。例如,第一个(" bobjames"" devsys"的出现)是因为您在源数据帧中没有这两个值之间的逗号。第二个是因为大熊猫并不关心数据框的名称,但在合并时会关心列的名称(你有一个名为&#34的数据框;名称"而且你的列也被称为&# 34;名称&#34)。否则,合并似乎完全符合您的要求:

import pandas as pd
names = pd.DataFrame({'names':['bob','frank','bob','bob','bob', 'james','tim','ricardo','mike','mark','joan','joe'], 
                      'position':['dev','dev','dev','dev','dev','dev', 'sys','sys','sys','sup','sup','sup']})

info = pd.DataFrame({'names':['joe','mark','tim','frank','joe','bill'],
                     'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna('unknown', inplace=True)

将导致:

      names position classification
0       bob      dev        unknown
1       bob      dev        unknown
2       bob      dev        unknown
3       bob      dev        unknown
4     frank      dev          thief
5     james      dev        unknown
6       tim      sys           good
7   ricardo      sys        unknown
8      mike      sys        unknown
9      mark      sup          thief
10     joan      sup        unknown
11      joe      sup          thief
12      joe      sup           good
13     bill  unknown          thief

答案 1 :(得分:14)

我认为你想要执行outer merge

In [60]:

pd.merge(names, info, how='outer')
Out[60]:
     names position classification
0      bob      dev            NaN
1    frank      dev          thief
2    james      dev            NaN
3      tim      sys           good
4  ricardo      sys            NaN
5     mike      sys            NaN
6     mark      sup          thief
7     joan      sup            NaN
8      joe      sup          thief

有一节显示合并的类型可以执行:http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

答案 2 :(得分:0)

将其视为SQL连接操作。您需要left-outer加入[1]。

names = pd.DataFrame({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})

info = pd.DataFrame({'names':['joe','mark','tim','frank'],'classification':['thief','thief','good','thief']})

由于names没有classification,因此left-outer加入将完成此任务。

a = pd.merge(names, info, how='left', on='names')

结果是......

>>> a
     names position classification
0      bob      dev            NaN
1    frank      dev          thief
2    james      dev            NaN
3      tim      sys           good
4  ricardo      sys            NaN
5     mike      sys            NaN
6     mark      sup          thief
7     joan      sup            NaN
8      joe      sup          thief

......这很好。如果你看两个表,那么所有NaN结果都可以。

干杯!

[1] - http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

答案 3 :(得分:0)

对于外连接或内连接,也可以使用 join 函数。在上面的例子中,假设 names 是主表(该表中的所有行都必须出现在结果中)。然后运行左外连接使用:

what = names.set_index('names').join(info.set_index('names'), how='left')

分别

what = names.set_index('names').join(info.set_index('names'), how='left').fillna("unknown")

set_index 函数用于创建临时索引列(两个表中相同)。当数据框包含此类索引列时,则不需要此步骤。例如:

# define index when create dataframes
names = pd.DataFrame({'names':['bob',...],'position':['dev',...]}).set_index('names')
info = pd.DataFrame({'names':['joe',...],'classification':['thief',...]}).set_index('names')

what = names.join(info, how='left')

要执行其他类型的连接,只需更改 how 属性(允许使用 left/right/inner/outer)。更多信息here