Saya memiliki kerangka data seperti ini:

>>> df = pd.DataFrame([['bar',0],['restaurant',0],
...                    ['bar',0],
...                    ['movie',1],['bar',1],['restaurant',1],
...                    ['bar',2],['restaurant',2],['movie',2]]
...                    ,columns=['place','ID'])
>>> df
        place  ID
0         bar   0
1  restaurant   0
2         bar   0
3       movie   1
4         bar   1
5  restaurant   1
6         bar   2
7  restaurant   2
8       movie   2

Saya ingin mengelompokkan berdasarkan ID dan mendapatkan kombinasi unik tempat, secara berurutan, dengan pengulangan yang diizinkan. Jika saya melakukan ini:

>>> df.groupby('ID')['place'].unique().apply(lambda x: tuple(sorted(x))).reset_index()
   ID                     place
0   0         (bar, restaurant)
1   1  (bar, movie, restaurant)
2   2  (bar, movie, restaurant)

Ini hampir benar, tetapi saya ingin pengulangan diizinkan:

                      place  ID
0    (bar, bar, restaurant)   0
1  (bar, movie, restaurant)   1
2  (bar, movie, restaurant)   2

Bantuan sangat dihargai.

3
Benjamin Latimer 2 Juli 2020, 20:30

1 menjawab

Jawaban Terbaik

Saya akan menggunakan groupby dengan as_index=False tanpa unique. Juga lebih cepat jika kita memesan terlebih dahulu daripada memesan setiap kelompok.

new_df = (df.sort_values('place')
            .groupby('ID',as_index=False)[['place']]
            .agg(tuple))
print(new_df)

   ID                     place
0   0    (bar, bar, restaurant)
1   1  (bar, movie, restaurant)
2   2  (bar, movie, restaurant)

Atau :

(df.sort_values('place')
   .groupby('ID')['place']
   .apply(tuple)
   .reset_index()
)
4
ansev 2 Juli 2020, 17:47