web-dev-qa-db-ja.com

あるデータフレームの列の値を別のデータフレームの値に置き換えます

2つのデータフレームがあり、最初のデータフレームは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の一意の値です。

2番目のデータフレームには、これらすべての50個の一意の値(50行)と、これらの値に関連付けられているホテルも含まれます。

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver

私の目標は、最初のデータフレームの列Groupの値を、2番目のデータフレームの列Hotelの対応する値で置き換えるか、列Hotelを作成することです対応する値。のような割り当てだけでそれを作ろうとするとき

df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel

データフレームが同じサイズではないというエラーが発生したため、比較できません

17
Amanda

他のdfの 'Group'列にインデックスを設定する場合、元のdf 'Group'列で 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
25
EdChum

辞書を作成して、applyを使用することもできます。

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
1
Greg Friedman

pandas joinを使用すると、詳細リンクを参照できます: http://pandas.pydata.org/pandas-docs/stable/merging.html

df1.join(df2,on='Group')
1
176coding

これは古い質問ですが、ここに別の方法があります。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

データフレーム1からすべてのホテルID(キー列)をリストとして取得します

key_list = list(df_1['Group'])

['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']

キー列と値列を持つルックアップデータフレームから辞書を作成します

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
0
vkt

pandas DataFramesは単なるシリーズです。ここに示すように、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

両方のインデックスは「グループ」であり、割り当てが可能です。

同じようにインデックス付けされたシリーズをDataFrame列に割り当てると、割り当ては機能します。 dfにグループ値が重複しているにもかかわらず、これが機能することに注意してください。 hotel_groupsシリーズに重複するインデックス値(対応するデータ値が異なる)がある場合は機能しません(たとえば、インデックス値hsgc_T2に2つのエントリがあり、1つ目はデータ値Frank、2つ目はデータ値Luxyである場合) df ['hotel']に割り当てられます(この例では発生しません)。これは、インデックス付きのDataFrame列に割り当てる値を知る方法がないため機能しません。

0