web-dev-qa-db-ja.com

pandas GroupBy)を使用して複数の列から一意の値を集計します

数え切れないほどのスレッド( 12 ...)に入りましたが、それでも問題の解決策が見つかりません... I次のようなデータフレームがあります。

_prop1 prop2 prop3    prop4 
L30   3     bob      11.2
L30   54    bob      10
L30   11    john     10
L30   10    bob      10
K20   12    travis   10 
K20   1     travis   4 
K20   66    leo      10
_

Prop1でgroupbyを実行し、同時に、他のすべての列を集計しますが、一意の値のみを使用します。そのように:

_prop1  prop2       prop3       prop4
L30    3,54,11,10  bob,john    11.2,10
K20    12,1,66     travis,leo  10,4
_

私はさまざまな方法で試しました:

  1. df.groupby('prop1')['prop2','prop3','prop4'].apply(np.unique)は戻り値

AttributeError: 'numpy.ndarray'オブジェクトには属性がありません 'index' PLUS TypeError:Series.nameはハッシュ可能なタイプである必要があります

  1. また:.apply(lambda x: pd.unique(x.values.ravel()).tolist())は出力としてリストを提供し、列が必要です。

  2. 複数の列があるため、df.groupby('prop1')['prop2','prop3','prop4'].unique()自体は機能しません。

  3. .apply(f)(fは次のとおり)

    def f(df): df['prop2']=df['prop2'].drop_duplicates() df['prop3']=df['prop3'].drop_duplicates() df['prop4']=df['prop4'].drop_duplicates() return df

何もしません。

  1. また、さまざまなオプションで.agg()を使用しようとしましたが、成功しませんでした。

あなたの一人は何か考えがありますか?

どうもありがとうございました :)

5
Nithrynx

これを試してみてください、それは私にとって完璧に機能しました:

df.groupby(['prop1','prop2', 'prop4']).agg(lambda x: ','.join(x.unique())).reset_index()

これにより、次のような結果が得られます。

prop1  prop2       prop3       prop4
L30    3,54,11,10  bob,john    11.2,10
K20    12,1,66     travis,leo  10,4
1

melt + pivot_table

s = df.astype(str).melt(id_vars='prop1').drop_duplicates()

s.pivot_table(
  index='prop1',
  columns='variable',
  values='value',
  aggfunc=','.join)
variable       prop2       prop3      prop4
prop1
K20          12,1,66  travis,leo   10.0,4.0
L30       3,54,11,10    bob,john  11.2,10.0
1
user3483203