2017-02-25 6 views
1

私はPandasを初めて使っていて、ちょっと遊んでいます。私は、共通のインデックス、ユーザIDに基づいて2つのデータフレームを結合することが不可欠であることを望んでいます。しかし、もう少ししたいと思います。最初の表(ユーザーIDとその年齢を含む)では、各ユーザーIDは一意です。 2番目のテーブル(ユーザーIDとそのコースは含まれていますが、ユーザーIDでソートされていません)では、同じユーザーIDが複数存在することがあります(ユーザーは複数のコースを取ることができますが、コース)。データセットはかなり大きいので、これは私が手動で行うことはできません。結果の表のユーザーIDが一意であるため、各行に{ユーザーID、年齢、すべてのコース}が含まれているというプロパティを維持するように参加したい場合、どうすればよいですか。共通のインデックスに2つのデータフレームをマージする(別々の行を作成する必要なし)

例えば、私は

Table 1:    Table 2: 
User Id Age   User Id Coursework 
1  18   1  Pre Calculus 
2  17   2  Chemistry 
3  18   3  English 
4  16   2  Linear Algebra 
        1  World History 
        4  Multivariable Calculus 
        1  Psychology 
        3  Government 
        4  Physics (E&M) 

のようなものを持っているかもしれないと私は結果が見えるようにしたい:

User Id Age Coursework 
1  18 Pre Calculus, World History, Psychology 
2  17 Chemistry, Linear Algebra 
3  18 English, Government 
4  16 Multivariable Calculus, Physics (E&M) 

にはどうすればいいのと同じくらい簡単な方法でこれを行うに行きますか可能?マージやそれに加えて何かを行う以外のアプローチが必要かもしれません。とにかく、これは私が大規模なデータセットでやっていることに本当に便利です。事前にあなたの助けをありがとう!

答えて

1

Iあなたは必要と思いますgroupbyapplyjoinmerge

df2 = df2.groupby('User Id')['Coursework'].apply(', '.join).reset_index() 
#default inner join 
df = pd.merge(df1, df2, on='User Id') 
#for left join (if some values in df2 are missing) 
#df = pd.merge(df1, df2, on='User Id', how='left') 
print (df) 
    User Id Age        Coursework 
0  1 18 Pre Calculus, World History, Psychology 
1  2 17    Chemistry, Linear Algebra 
2  3 18      English, Government 
3  4 16 Multivariable Calculus, Physics (E&M) 

concatのもう一つの解決策:

df2 = df2.groupby('User Id')['Coursework'].apply(', '.join) 
df1 = df1.set_index('User Id') 
df = pd.concat([df1, df2], axis=1, join='inner').reset_index() 
print (df) 
    User Id Age        Coursework 
0  1 18 Pre Calculus, World History, Psychology 
1  2 17    Chemistry, Linear Algebra 
2  3 18      English, Government 
3  4 16 Multivariable Calculus, Physics (E&M) 
+0

ありがとう!これは非常に役立ち、両方の方法を見てうれしいです。 –

+0

データフレームが大きければ、 'concat'が速くなると思います。 – jezrael

+0

私の意見では、両方の答えをupvoteすることができます(上の「0」の上にある小さな三角形をクリックするとマークを受け取ります)。次に、受け入れられた答えの1つを選択します(それはあなた次第です)。ニースの日;) – jezrael

1

私が最初に(グループ)は、第2のDFを変換してから最初のDFでそれをマージしたい:

In [11]: b.groupby('User_Id', as_index=False)[['Coursework']] \ 
      .agg(', '.join).merge(a, on='User_Id') 
Out[11]: 
    User_Id        Coursework Age 
0  1 Pre Calculus, World History, Psychology 18 
1  2    Chemistry, Linear Algebra 17 
2  3      English, Government 18 
3  4 Multivariable Calculus, Physics (E&M) 16 

データ:

In [12]: a 
Out[12]: 
    User_Id Age 
0  1 18 
1  2 17 
2  3 18 
3  4 16 

In [13]: b 
Out[13]: 
    User_Id    Coursework 
0  1   Pre Calculus 
1  2    Chemistry 
2  3     English 
3  2   Linear Algebra 
4  1   World History 
5  4 Multivariable Calculus 
6  1    Psychology 
7  3    Government 
8  4   Physics (E&M) 

説明:

In [15]: b.groupby('User_Id', as_index=False)[['Coursework']].agg(', '.join) 
Out[15]: 
    User_Id        Coursework 
0  1 Pre Calculus, World History, Psychology 
1  2    Chemistry, Linear Algebra 
2  3      English, Government 
3  4 Multivariable Calculus, Physics (E&M) 
+0

はとても迅速に対応いただき、ありがとうございます!これは非常に便利です! –

+0

@JaneSully、あなたは歓迎です:-) – MaxU

関連する問題