我有两个数据帧,第一个有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
我有一个错误,即数据帧的大小不同,因此无法进行比较
答案 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