Saya punya dua DataFrames:

df1 = pd.DataFrame({"id": [1, 2, 3, 4]})

df2 = pd.DataFrame({"id": [1, 1, 2, 4, 4, 4],
                  "text": ["a", "a", "b", "a", "b", "b"]})

Keluaran df1:

   id
0   1
1   2
2   3
3   4

Keluaran df2:

   id value
0   1    a
1   1    a
2   2    b
3   4    a
4   4    b
5   4    b

Tujuan saya adalah menambahkan tiga kolom di df1.

Di count_all saya ingin menghitung id yang sesuai di df2. Misalnya. id 4 ada 3 kali di df2.

Di count_a saya ingin menghitung id yang sesuai di df2 di mana nilai teks == a.

Di count_b saya ingin menghitung id yang sesuai di df2 di mana nilai teks == b.

   id  count_all  count_a  count_b
0   1          2        2        0
1   2          1        0        1
2   3          0        0        0
3   4          3        1        2

Bagaimana ini bisa dilakukan dengan panda?

2
comstack 28 Mei 2021, 13:40

2 jawaban

Jawaban Terbaik

Gunakan crosstab dengan margins, tambahkan nilai indeks yang hilang atau ubah urutan kolom dengan DataFrame.reindex, ubah nama kolom dengan DataFrame.add_prefix dan terakhir bergabung ke df1 oleh DataFrame.join:

df = (df1.join(pd.crosstab(df2['id'], df2['text'], margins=True)
                 .reindex(index=df1['id'].unique(), 
                          columns=['All'] + df2['text'].unique().tolist(), 
                          fill_value=0)
                 .add_prefix('count_'), on='id'))
print (df)
   id  count_All  count_a  count_b
0   1          2        2        0
1   2          1        0        1
2   3          0        0        0
3   4          3        1        2
3
jezrael 28 Mei 2021, 10:43

Ini cara lain:

df1.join(df2.groupby('id').agg(
    count_all = ('id','count'),
    count_a=('text',lambda x: sum(x.eq('a'))),
    count_b = ('text',lambda x: sum(x.eq('b')))),on='id').fillna(0)
0
rhug123 28 Mei 2021, 12:46