1

こんにちは、私は pandas/python を使用しており、次の行に沿ってデータフレームを持っています:

21627   red
21627   green
21627   red
21627   blue
21627   purple
21628   yellow
21628   red
21628   green
21629   red
21629   red

私が減らしたいのは:

21627   red, green, blue, purple
21628   yellow, red, green
21629   red

これを行う最良の方法は何ですか (そして、リスト内のすべての値を一意の値に折りたたむ)?

また、冗長性を維持したい場合:

21627   red, green, red, blue, purple
21628   yellow, red, green
21629   red, red

これを達成する最良の方法は何ですか?

助けてくれてありがとう。

4

2 に答える 2

7

これを本当にやりたい場合は、groupby apply を使用できます。

In [11]: df.groupby('id').apply(lambda x: list(set(x['colours'])))
Out[11]: 
id
21627    [blue, purple, green, red]
21628          [green, red, yellow]
21629                         [red]
dtype: object

In [12]: df.groupby('id').apply(lambda x: list(x['colours']))
Out[12]: 
id
21627    [red, green, red, blue, purple]
21628               [yellow, red, green]
21629                         [red, red]
dtype: object

ただし、リストを含む DataFrame は特に効率的ではありません。

ピボット テーブルは、より便利な DataFrame を取得します。

In [21]: df.pivot_table(rows='id', cols='colours', aggfunc=len, fill_value=0)
Out[21]: 
colours  blue  green  purple  red  yellow
id                                       
21627       1      1       1    2       0
21628       0      1       0    1       1
21629       0      0       0    2       0

私のお気に入りの関数get_dummiesでは、それを行うことができますが、エレガントでも効率的でもありません (ただし、この元の提案は、クレイジーな場合でも保持します)。

In [22]: pd.get_dummies(df.set_index('id')['colours']).reset_index().groupby('id').sum()
Out[22]: 
       blue  green  purple  red  yellow
id                                     
21627     1      1       1    2       0
21628     0      1       0    1       1
21629     0      0       0    2       0
于 2013-08-22T13:33:23.540 に答える
2

別の方法があります。@Andyはもう少し直感的ですが

In [24]: df.groupby('id').apply(
              lambda x: x['color'].value_counts()).unstack().fillna(0)
Out[24]: 
       blue  green  purple  red  yellow
id                                     
21627     1      1       1    2       0
21628     0      1       0    1       1
21629     0      0       0    2       0
于 2013-08-22T14:03:04.127 に答える