在熊猫中合并的问题

时间:2017-06-09 05:47:02

标签: python pandas merge

我在合并2个pandas数据帧时遇到了问题。

a = [{'City':'CCC','ID':'BBB'},{'City':'AAA','ID':'DDD'},{'City':'CCC','ID':'HHH'}]
b = [{'City':'AAA','Name':'FFF'},{'City':'CCC','Name':'GGG'}]
df1 = pd.DataFrame(a)
df2 = pd.DataFrame(b)
df3 = pd.merge(df1,df2,how='left',on='City')

DF1:

   City ID
0   CCC BBB
1   AAA DDD
2   CCC HHH

DF2:

    City Name
0   AAA  FFF
1   CCC  GGG

DF3:

    City ID     Name
0   CCC  BBB    GGG
1   AAA  DDD    FFF
2   CCC  HHH    GGG

在上面的模拟代码中,df3['Name']没有NaN个值。但是,在我的真实数据框架中(我无法在此分享),相当于df3['Name']的{​​{1}}值具有NaN值,但它不应该因为df1['City']df2['City']中的所有元素而'AAA' in df1['City'] 匹配我的真实数据帧(不是这些模拟数据帧)。所以,我尝试排除故障并找到以下内容。

如果我尝试以下代码,

False

我得到True,但它应该是'AAA',因为'AAA' in sorted(df1['City']) 位于该列中。

但是,如果我尝试以下代码,

True

我得到len([x for x in df1['City'] if x not in df2['City']]) ,这是我所期待的。

另外,为了确认,我试试这个:

3

获得0的输出,该输出应为numpy.vstack()

所以,我想知道上述问题的原因是什么,以及为什么合并真实数据帧不起作用的猜测?用于合并的列的元素是字符串。

2 个答案:

答案 0 :(得分:2)

您在此示例中未获得任何NaN,因为'City'df1列的每个元素都位于'City'的{​​{1}}列中。

尝试使用此示例

df2

您可以查看a = [ {'City':'CCC','ID':'BBB'}, {'City':'AAA','ID':'DDD'}, {'City':'CCC','ID':'HHH'}, {'City':'DDD','ID':'XXX'} ] b = [ {'City':'AAA','Name':'FFF'}, {'City':'CCC','Name':'GGG'} ] df1 = pd.DataFrame(a) df2 = pd.DataFrame(b) df3 = pd.merge(df1,df2,how='left',on='City') df3 City ID Name 0 CCC BBB GGG 1 AAA DDD FFF 2 CCC HHH GGG 3 DDD XXX NaN

中是否有'AAA'
df3.City

或者

(df3.City == 'AAA').any()

True

答案 1 :(得分:2)

首先,您要仔细检查'AAA' in df3.City.tolist() True - 需要isin来检查多个值,或者与AAA进行比较,如果需要标量输出,请添加any以检查至少一个{{1} }}

另见using the in operator

Series
True
#this check in index, not in values
print ('AAA' in df1['City'])
False

print (0 in df1['City'])
True

您在输出中的#this check in list from column print (sorted(df1['City'])) ['AAA', 'CCC', 'CCC', 'DDD'] print ('AAA' in sorted(df1['City'])) True #pandas function for checking multiple values is isin print (df1['City'].isin(['AAA', 'EEE'])) 0 False 1 True 2 False Name: City, dtype: bool print (df1['City'].isin(['AAA', 'EEE']).any()) True 列中得到print (df3['City'] == 'AAA') 0 False 1 True 2 False Name: City, dtype: bool print ((df3['City'] == 'AAA').any()) True ,因为没有匹配 - 它会显示另一个答案。

您可以通过以下方式获得差异值:

NaN

City用于检查多个值,#borrowed sample from piRSquared's answer a = [ {'City':'CCC','ID':'BBB'}, {'City':'AAA','ID':'DDD'}, {'City':'CCC','ID':'HHH'}, {'City':'DDD','ID':'XXX'} ] b = [ {'City':'AAA','Name':'FFF'}, {'City':'CCC','Name':'GGG'} ] df1 = pd.DataFrame(a) df2 = pd.DataFrame(b) print (np.setdiff1d(df1['City'], df2['City'])) ['DDD'] 用于反转布尔值掩码。

然后可以使用boolean indexing

isin