pandas将dataframe与NaN(或“unknown”)合并以查找丢失的值

2024-10-06 12:00:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,其中一个对另一个中的某些(但不是全部)行有补充信息。

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。结果产生了一个数据帧,其中一些人是他们的,一些人是好的,而其他人是未知的。

编辑: 我得到的第一个答案之一是建议使用merge 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没有出现在names数据框中,它也会出现在结果数据框中。所以我真的需要一种方法来表示在另一个数据框中查找一个值,如果你在这些列上发现了什么。


Tags: 数据frankdevinfo信息dfnamessys
3条回答

我想你想做一个outer^{}

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

把它看作一个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

如果你还在寻找答案:

您所描述的“奇怪”的事情是由于代码中的一些小错误造成的。例如,第一个(出现“bobjames”和“devsys”)是因为在源数据帧中这两个值之间没有逗号。第二个原因是pandas不关心数据帧的名称,而是在合并时关心列的名称(有一个名为“names”的数据帧,但列也名为“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)

这将导致:

      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

相关问题 更多 >