簡體   English   中英

用另一個數據幀的值替換一個數據幀中的列值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM