比较Pandas数据框并返回第一个数据框缺失的行。

14

我有两个数据框,想比较它们并返回第一个数据框(df1)中不在第二个数据框(df2)中的行。我找到了一种方法来比较它们并返回差异,但无法弄清楚如何仅返回df1中缺失的内容。

import pandas as pd
from pandas import Series, DataFrame

df1 = pd.DataFrame( { 
"City" : ["Chicago", "San Franciso", "Boston"] , 
"State" : ["Illinois", "California", "Massachusett"] } )

df2 = pd.DataFrame( { 
"City" : ["Chicago",  "Mmmmiami", "Dallas" , "Omaha"] , 
"State" : ["Illinois", "Florida", "Texas", "Nebraska"] } )



df = pd.concat([df1, df2])
df = df.reset_index(drop=True)

df_gpby = df.groupby(list(df.columns))
idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
blah = df.reindex(idx)

你可以更具体一些。问题是什么?出了什么问题?... - lrleon
4个回答

18

在@EdChum的建议基础上构建:

df = pd.merge(df1, df2, how='outer', suffixes=('','_y'), indicator=True)
rows_in_df1_not_in_df2 = df[df['_merge']=='left_only'][df1.columns]

rows_in_df1_not_in_df2

|Index |City        |State       |
|------|------------|------------|
|1     |San Franciso|California  |
|2     |Boston      |Massachusett|

编辑:纳入@RobertPeters的建议


1
应该这样写才能正常工作:df = pd.merge(df1, df2, how='outer', suffixes=('','_y'), indicator=True)。 - Robert Peters

11

如果我理解正确的话,如果你使用的是 pandas 版本 0.17.0,那么你可以使用 merge 并设置 indicator=True:

In [80]:
df1 = pd.DataFrame( { 
"City" : ["Chicago", "San Franciso", "Boston"] , 
"State" : ["Illinois", "California", "Massachusett"] } )
​
df2 = pd.DataFrame( { 
"City" : ["Chicago",  "Mmmmiami", "Dallas" , "Omaha"] , 
"State" : ["Illinois", "Florida", "Texas", "Nebraska"] } )
pd.merge(df1,df2, how='outer', indicator=True)

Out[80]:
           City         State      _merge
0       Chicago      Illinois        both
1  San Franciso    California   left_only
2        Boston  Massachusett   left_only
3      Mmmmiami       Florida  right_only
4        Dallas         Texas  right_only
5         Omaha      Nebraska  right_only

这将添加一列指示行仅存在于lhs或rhs中的指示器。


3

你也可以使用列表推导式并比较行来返回丢失的元素:

dif_list = [x for x in list(df1['City'].unique()) if x not in list(df2['City'].unique())]

返回值:

['San Franciso', 'Boston']

您可以获取仅包含不同行的数据框:

dfdif = df1[(df1['City'].isin(dif_list))]

2
这是一种很好的方法,通过索引查看缺失的行 - 特别是当唯一的行仅可通过多重索引进行识别时 - 例如:dif = [ x for x in list(df2.index) if not x in list( df1.index ) ] - markling

2
如果您使用的是 pandas < 0.17.0 版本,您可以按以下方式操作:
In [182]: df = pd.merge(df1, df2, on='City', how='outer')

In [183]: df
Out[183]:
           City       State_x   State_y
0       Chicago      Illinois  Illinois
1  San Franciso    California       NaN
2        Boston  Massachusett       NaN
3      Mmmmiami           NaN   Florida
4        Dallas           NaN     Texas
5         Omaha           NaN  Nebraska

In [184]: df.ix[df['State_y'].isnull(),:]
Out[184]:
           City       State_x State_y
1  San Franciso    California     NaN
2        Boston  Massachusett     NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接