我有两个数据帧,其中一个对另一个中的某些(但不是全部)行有补充信息。
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数据框中,它也会出现在结果数据框中。所以我真的需要一种方法来表示在另一个数据框中查找一个值,如果你在这些列上发现了什么。
我想你想做一个} :
outer
^{有一节显示了可以执行的合并类型: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')
结果是。。。
。。。这很好。如果同时查看这两个表,所有的
NaN
结果都是可以的。干杯!
[1]-http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging
如果你还在寻找答案:
您所描述的“奇怪”的事情是由于代码中的一些小错误造成的。例如,第一个(出现“bobjames”和“devsys”)是因为在源数据帧中这两个值之间没有逗号。第二个原因是pandas不关心数据帧的名称,而是在合并时关心列的名称(有一个名为“names”的数据帧,但列也名为“names”)。否则,合并似乎正按您所期望的方式进行:
这将导致:
相关问题 更多 >
编程相关推荐