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

Kev*_*son 30 python dataframe pandas

我有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']})
Run Code Online (Sandbox Code Playgroud)

我想从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")
Run Code Online (Sandbox Code Playgroud)

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

oxt*_*tay 17

如果您仍在寻找答案:

您描述的"奇怪"事情是由于代码中的一些小错误造成的.例如,第一个(出现"bobjames"和"devsys")是因为源数据帧中的这两个值之间没有逗号.第二个是因为pandas不关心数据框的名称,但在合并时会关心列的名称(您有一个名为"names"的数据框,但您的列也称为"名称").否则,似乎合并正在完成你正在寻找的东西:

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)
Run Code Online (Sandbox Code Playgroud)

这将导致:

      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
Run Code Online (Sandbox Code Playgroud)


EdC*_*ica 15

我想你想表演一个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
Run Code Online (Sandbox Code Playgroud)

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

  • @MartinThøgersen抱歉,我建议了一些我认为无需尝试即可工作的东西,这是 pandas 的怪癖,我查看了一个 git 问题:https://github.com/pandas-dev/pandas/issues/17494 ,这有效:`what ['classification'].replace({np.NaN:None})` 似乎 `None` 只是被解释为 `NaN`,如果你传递一个 dict 那么它会正确地达到所需的结果,另外还使用 `where`有效:what['classification'].where(pd.notnull(what['classification']), None),相关/sf/ask/991390641/ -a-none-to-use-with-mysqldb (2认同)