在两个pandas DataFrame

时间:2017-11-29 19:21:25

标签: python pandas join dataframe

nocity.head()      

    user_id                 business_id             stars

0   cjpdDjZyprfyDG3RlkVG3w  uYHaNptLzDLoV_JZ_MuzUA  5
1   bjTcT8Ty4cJZhEOEo01FGA  uYHaNptLzDLoV_JZ_MuzUA  3
2   AXgRULmWcME7J6Ix3I--ww  uYHaNptLzDLoV_JZ_MuzUA  3
3   oU2SSOmsp_A8JYI7Z2JJ5w  uYHaNptLzDLoV_JZ_MuzUA  4
4   0xtbPEna2Kei11vsU-U2Mw  uYHaNptLzDLoV_JZ_MuzUA  5   
withcity.head()

    business_id             city

0   YDf95gJZaq05wvo7hTQbbQ  Richmond Heights
1   mLwM-h2YhXl2NCgdS84_Bw  Charlotte
2   v2WhjAB3PIBA8J8VxG3wEg  Toronto
3   CVtCbSB1zUcUWg-9TNGTuQ  Scottsdale
4   duHFBe87uNSXImQmvBh87Q  Phoenix

nocity数据框有business_id,(它们可能会重复,因为每个user_id每个business_id都有评分

withcity数据框与city

相关联business_id

我想要的结果是:

这很难说出来:

我想从city数据框中查找与business_id相关联的withcity,并在名为nocity的{​​{1}}中创建一个新列具有与cityname

相关联的城市名称

为什么我放弃尝试并来到这里

我知道这可以通过某种联接操作来执行..但我不明白哪一个......我在网上看了他们并且对于如果某些{{1}会发生什么会有点困惑在执行该连接操作时,两个数据帧中是否可用?

例如:

business_id有一些business_id,其值withcity;在使用business_id执行任何适当的加入时,它找不到特定的city

所以我来这里寻求帮助。

我尝试了哪些其他选择?

nocity

我创建了一个字典,其中包含business_id数据框中的area_dict = dict(zip(withcity.business_id, withcity.city)) emptylist = [] for rows in nocity['business_id']: for key, value in area_dict.items(): if(key == rows): emptylist.append(value) business_id,并与city数据框进行了某种匹配比较。

但我的方法可能需要花费很多时间,因为确切地说有470万条记录。

2 个答案:

答案 0 :(得分:1)

IIUC merge

nocity.merge(withcity,on='business_id',how='left')
Out[855]: 
                  user_id             business_id  stars city
0  cjpdDjZyprfyDG3RlkVG3w  uYHaNptLzDLoV_JZ_MuzUA      5  NaN
1  bjTcT8Ty4cJZhEOEo01FGA  uYHaNptLzDLoV_JZ_MuzUA      3  NaN
2  AXgRULmWcME7J6Ix3I--ww  uYHaNptLzDLoV_JZ_MuzUA      3  NaN
3  oU2SSOmsp_A8JYI7Z2JJ5w  uYHaNptLzDLoV_JZ_MuzUA      4  NaN
4  0xtbPEna2Kei11vsU-U2Mw  uYHaNptLzDLoV_JZ_MuzUA      5  NaN

答案 1 :(得分:0)

一般情况下,只要您遇到这种情况,就要考虑避免循环和迭代,而是执行合并。然后 ,按摩数据以满足您的需求。例如,Wen的解决方案是最合适的方法。

但是我会添加一些东西。说这些是我下面的两个dfs:

NOCITY DF

WITHCITY DF

让我们分别调用第一个和第二个dfs, nocity和withcity

你想这样做:

nocity.merge(withcity, on='business_id', how='left')

然而,如果你最终获得了温度高于上的纳米值。 检查密钥的数据类型

意思是,如果nocity中的business_id字段为int(由于某种原因),而withcity中的business_id字段为str,那么Pandas将会出现合并数据帧的问题,并且您将获得NaN值而不是所需的城市名称。

要检查你会做什么

#for all datatypes in the nocity df
print(nocity.dtypes)
#or just for the field's dtypes
print(nocity.business_id.dtypes)

然后你会转换为一个常见的数据类型,如果它们不同......

#example conversion of pandas column (series) to different datatype
nocity.business_id = nocity.business_id.astype(str)
withcity.business_id = withcity.business_id.astype(str)

#then perform merge as usual
nocity = nocity.merge(withcity, on='business_id', how='left')

Merge Results

希望这会有所帮助。另外,如果您喜欢,请不要忘记将您的名字从“城市”更改为“城市名称”

nocity.rename(columns = {'city': 'city name'})