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

时间:2016-04-04 22:25:53

标签: python search pandas dataframe

我有两个数据帧,第一个有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

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

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

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver

我的目标是将第一个数据框的Group列中的值替换为第二个数据框的列Hotel的相应值,或者创建列Hotel,相应的值。当我尝试通过像

这样的任务来完成它
df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel

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

5 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:1)

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

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])

答案 2 :(得分:1)

只需使用pandas join,您可以参考详细链接:http://pandas.pydata.org/pandas-docs/stable/merging.html

df1.join(df2,on='Group')

答案 3 :(得分:0)

pandas DataFrames中的列只是Series。使DataFrame(或DataFrame和Series,如此处所示)共享相同的索引,以便可以从Series到DataFrame进行分配:

**In:**

df = pd.DataFrame(data=
{'date': ['2011-06-09', '2011-07-09', '2011-09-10', '2011-11-02'], 
'family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 
'bonus': ['456', '679', '431', '569']}, 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']))

**Out:**
            date    family  bonus
Group           
tri23_1 2011-06-09  Laavin  456
hsgç_T2 2011-07-09  Grendy  679
bbbj-1Y_jn  2011-09-10  Fantol  431
hsgç_T2 2011-11-02  Gondow  569

**In:**

hotel_groups = pd.Series(['Jamel', 'Frank', 'Luxy', 'Grand Hotel', 'Vancouver'], 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'mlkl_781', 'vchs_94']))

**Out:**

Group
tri23_1             Jamel
hsgç_T2             Frank
bbbj-1Y_jn           Luxy
mlkl_781      Grand Hotel
vchs_94         Vancouver
dtype: object

**In:**

df['hotel'] = hotel_groups

**Out:**

            date    family  bonus hotel
Group               
tri23_1 2011-06-09  Laavin  456 Jamel
hsgç_T2 2011-07-09  Grendy  679 Frank
bbbj-1Y_jn  2011-09-10  Fantol  431 Luxy
hsgç_T2 2011-11-02  Gondow  569 Frank

请注意,两者的索引均为“组”,这允许分配。

如果将类似索引的系列分配给DataFrame列,则分配有效。请注意,尽管df中存在重复的组值,但此方法仍然有效。如果hotel_groups系列中存在重复的索引值(具有不同的对应数据值),则将不起作用(例如,如果索引值hsgc_T2有两个条目,第一个条目的数据值为Frank,第二个条目的数据为Luxy分配给df ['hotel'](这不会在您的示例中发生)。这将无法正常工作,因为无法知道分配与索引相似的DataFrame列的值。

答案 4 :(得分:0)

这是一个古老的问题,但这是另一种解决方法,它不像熊猫那样,但​​速度很快

再现数据帧1-将对其进行更新

df_1

    Date    Group   Family  Bonus
0   2011-06-09  tri23_1     Laavin  456
1   2011-07-09  hsgç_T2     Grendy  679
2   2011-09-10  bbbj-1Y_jn  Fantol  431
3   2011-11-02  hsgç_T2     Gondow  569

再现数据帧2-查找

df_2

    Group   Hotel
0   tri23_1     Jamel
1   hsgç_T2     Frank
2   bbbj-1Y_jn  Luxy
3   mlkl_781    Grand Hotel
4   vchs_94     Vancouver

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

key_list = list(df_1['Group'])

['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']

从查找数据框中创建一个包含键col和值col的字典

dict_lookup = dict(zip(df_2['Group'], df_2['Hotel']))

{'bbbj-1Y_jn': 'Luxy',
 'hsgç_T2': 'Frank',
 'mlkl_781': 'Grand Hotel',
 'tri23_1': 'Jamel',
 'vchs_94': 'Vancouver'}

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

df_1['Group'] = [dict_lookup[item] for item in key_list]

更新的数据框1

    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
相关问题