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
データフレームが同じサイズではないというエラーが発生したため、比較できません
他の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
辞書を作成して、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の方法とは異なりますが、高速です
データフレーム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
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列に割り当てる値を知る方法がないため機能しません。