用另一个数据帧的值替换一个数据帧中的列值

Ama*_*nda 19 python search dataframe pandas

我有两个数据帧,第一个有1000行,看起来像:

Date            Group         Family       Bonus
2011-06-09      tri23_1       Laavin       456
2011-07-09      hsgç_T2       Grendy       679
2011-09-10      bbbj-1Y_jn    Fantol       431
2011-11-02      hsgç_T2       Gondow       569
Run Code Online (Sandbox Code Playgroud)

该列Group具有不同的值,有时会重复,但通常约有50个唯一值.

第二个数据框包含所有这50个唯一值(50行)以及与这些值相关联的酒店:

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver
Run Code Online (Sandbox Code Playgroud)

我的目标是Group将第一个数据帧的列中的值替换为Hotel第二个数据帧的列Hotel的相应值,或者使用相应的值创建列.当我试图通过任务来完成它时

df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel
Run Code Online (Sandbox Code Playgroud)

我有一个错误,即数据帧的大小不同,因此无法进行比较

EdC*_*ica 29

如果您将索引设置为另一个df上的"组"列,则可以map在原始df"组"列上替换使用:

In [36]:
df['Group'] = df['Group'].map(df1.set_index('Group')['Hotel'])
df

Out[36]:
         Date  Group  Family  Bonus
0  2011-06-09  Jamel  Laavin    456
1  2011-07-09  Frank  Grendy    679
2  2011-09-10   Luxy  Fantol    431
3  2011-11-02  Frank  Gondow    569
Run Code Online (Sandbox Code Playgroud)

  • 好奇:如果“df1['Group']”没有“df['Group']”中的所有值,这个答案会如何改变? (2认同)

小智 8

您还可以创建一个字典并使用 apply:

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
Run Code Online (Sandbox Code Playgroud)

  • 好奇:如果“df2['Group']”没有“df1['Group']”中的所有值,这个答案会如何改变? (4认同)

vkt*_*vkt 7

这是一个老问题,但这是另一种方法,它不像 pandas 方法,但速度很快

\n\n

复制数据帧 1 - 这将被更新

\n\n
df_1\n\n    Date    Group   Family  Bonus\n0   2011-06-09  tri23_1     Laavin  456\n1   2011-07-09  hsg\xc3\xa7_T2     Grendy  679\n2   2011-09-10  bbbj-1Y_jn  Fantol  431\n3   2011-11-02  hsg\xc3\xa7_T2     Gondow  569\n
Run Code Online (Sandbox Code Playgroud)\n\n

复制数据帧 2 - 查找

\n\n
df_2\n\n    Group   Hotel\n0   tri23_1     Jamel\n1   hsg\xc3\xa7_T2     Frank\n2   bbbj-1Y_jn  Luxy\n3   mlkl_781    Grand Hotel\n4   vchs_94     Vancouver\n
Run Code Online (Sandbox Code Playgroud)\n\n

从数据框 1 中获取所有酒店 ID(键列)作为列表

\n\n
key_list = list(df_1['Group'])\n\n['tri23_1', 'hsg\xc3\xa7_T2', 'bbbj-1Y_jn', 'hsg\xc3\xa7_T2']\n
Run Code Online (Sandbox Code Playgroud)\n\n

从查找数据帧创建一个字典,其中包含键 col 和值 col

\n\n
dict_lookup = dict(zip(df_2['Group'], df_2['Hotel']))\n\n{'bbbj-1Y_jn': 'Luxy',\n 'hsg\xc3\xa7_T2': 'Frank',\n 'mlkl_781': 'Grand Hotel',\n 'tri23_1': 'Jamel',\n 'vchs_94': 'Vancouver'}\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过查找值创建列表来替换值并将其分配给数据框 1 列

\n\n
df_1['Group'] = [dict_lookup[item] for item in key_list]\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新数据框 1

\n\n
    Date    Group   Family  Bonus\n0   2011-06-09  Jamel   Laavin  456\n1   2011-07-09  Frank   Grendy  679\n2   2011-09-10  Luxy    Fantol  431\n3   2011-11-02  Frank   Gondow  569\n
Run Code Online (Sandbox Code Playgroud)\n