Python 用另一个数据帧的值替换一个数据帧中的列值
我有两个数据帧,第一个有1000行,看起来像:Python 用另一个数据帧的值替换一个数据帧中的列值,python,search,pandas,dataframe,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
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
列组
具有不同的值,有时会重复,但通常约有50个唯一值
第二个数据帧包含所有这50个唯一值(50行)以及与这些值关联的酒店:
Group Hotel
tri23_1 Jamel
hsgç_T2 Frank
bbbj-1Y_jn Luxy
mlkl_781 Grand Hotel
vchs_94 Vancouver
我的目标是用第二个数据帧的Hotel
列的相应值替换第一个数据帧的Group
列中的值/或者用相应的值创建Hotel
列。当我试图通过这样的任务来完成它时
df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel
我有一个错误,即数据帧的大小不相等,因此无法进行比较如果将索引设置为另一个df上的“组”列,则可以替换原始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
您还可以创建字典并使用apply:
hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
只需使用pandas join,您可以参考详细信息链接:
数据帧中的列只是系列。使数据帧(或数据帧和系列,如图所示)共享相同的索引,以便可以从系列分配到数据帧:
**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
请注意,两者的索引都是“Group”,它允许赋值
如果将相似的索引序列分配给数据帧列,则分配有效。请注意,尽管df中存在重复的组值,但这仍然有效。如果hotel_groups系列中存在重复的索引值(具有不同的对应数据值)(例如,如果索引值hsgc_T2有两个条目,第一个条目的数据值为Frank,第二个条目的数据值为Luxy,分配给df[‘hotel’](在您的示例中不会出现这种情况)。这是行不通的,因为没有办法知道要为类似索引的数据帧列分配哪个值。这是一个老问题,但这里有另一种方法,它与pandas方法不同,但速度很快 复制数据帧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
从dataframe 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'}
通过查找值并指定给dataframe 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
好奇:如果
df1['Group']
没有df['Group']
中的所有值,这个答案会发生什么变化?好奇:如果df2['Group']
没有df1['Group']中的所有值,这个答案会发生什么变化
?这将在df1
中添加Hotel
列,我认为OP不希望这样做。
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