在两个数据帧之间执行适当的连接操作

2024-07-07 08:36:06 发布

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

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数据帧具有与每个business_id相关联的city

我想要的结果是:

这将非常难说:

我想从withcity数据框中查找与每个business_id相关联的city,并在nocity中创建一个名为cityname的新列,该列现在具有与该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)

我创建了一个字典,其中包含来自withcity数据帧的business_idcity,并与nocity数据帧进行了某种匹配比较

但是我的方法,可能会花很多时间,因为准确地说有470万条记录


Tags: 数据idcityforareabusinessheaddict
2条回答

IIUC^{}

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

一般来说,每当遇到这种情况时,您都希望考虑避免循环和迭代,而是执行合并。然后然后根据需要对数据进行处理。例如,温家宝的解决方案就是最恰当的方法

不过,我要补充几点。下面是我的两个DF:

NOCITY DF

WITHCITY DF

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

你想做:

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

然而,如果你最终得到了文在上文中提到的nan值检查钥匙的数据类型

也就是说,如果nocity中的business\u id字段是int(出于某种原因),而withcity中的business\u 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)

如果它们不同的话,你可以转换成一个普通的数据类型,比如str

#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

希望这有帮助。如果你喜欢的话,也别忘了把你的名字从city改成cityname

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

相关问题 更多 >