[英]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.