[英]replace column values in one dataframe by values of another 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
我有一个错误,即数据帧的大小不相等,因此无法进行比较
如果您将索引设置为另一个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 - 这将被更新
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
您还可以创建一个字典并使用apply:
hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
只需使用pandas join,您可以参考详细链接: http : //pandas.pydata.org/pandas-docs/stable/merging.html
df1.join(df2,on='Group')
pandas DataFrames中的列只是Series。 使DataFrames(或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
请注意,两者的索引都是“组”,允许分配。
如果将like-indexed Series分配给DataFrame列,则分配有效。 请注意,尽管df中存在重复的组值,但这仍然有效。 如果在hotel_groups系列中存在重复的索引值(具有不同的相应数据值),则不起作用(例如,如果索引值hsgc_T2有两个条目,第一个具有数据值Frank,第二个具有数据值Luxy,正在分配给df ['hotel'](并不是说你的例子中会出现这种情况)。这不起作用,因为没有办法知道分配索引相同的DataFrame列的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.