2017-08-14 5 views
1

におけるデータフレームの列の値でグループ化して辞書を作成します。次のように私は、7列を持つデータフレームを持っているのpython

Bank_Acct Firstname | Bank_Acct Lastname | Bank_AcctNumber | Firstname | Lastname | ID | Date1 | Date2 
    B1     | Last1    | 123    | ABC  | EFG  | 12 | Somedate | Somedate 
    B2     | Last2    | 245    | ABC  | EFG  | 12 | Somedate | Somedate 
    B1     | Last1    | 123    | DEF  | EFG  | 12 | Somedate | Somedate 
    B3     | Last3    | 356    | ABC  | GHI  | 13 | Somedate | Somedate 
    B4     | Last4    | 478    | XYZ  | FHJ  | 13 | Somedate | Somedate 
    B5     | Last5    | 599    | XYZ  | DFI  | 13 | Somedate | Somedate 

私は辞書を作成したい:

については
{ID1: (Count of Bank_Acct Firstname, Count of distinct Bank_Acct Lastname, 
     {Bank_AcctNumber1 : ItsCount, Bank_AcctNumber2 : ItsCount}, 
     Count of distinct Firstname, Count of distinct Lastname), 
    ID2: (...), } 

上記の例:以下

{12: (2, 2, {123: 2, 245: 1}, 2, 1), 13 : (3, 3, {356: 1, 478: 1, 599: 1}, 2, 3)} 

そのためのコードである。

cols = ['Bank First Name', 'Bank Last Name' 'Bank AcctNumber', 'First Name', 'Last Name'] 
    df1 = df.groupby('ID').apply(lambda x: tuple(x[c].nunique() for c in cols)) 
    d = df1.to_dict() 

しかし、上記のコードだけのような出力が得られます。

代わりに内部辞書の個別の銀行acctnumberのカウントを与える
{12: (2, 2, 2, 2, 1), 13 : (3, 3, 3, 2, 3)} 

代わりに必要な辞書を入手するにはどうすればよいですか?ありがとう!!

答えて

2

あなたはリストこれは動作しますが、非常に遅いです

In [15]: cols = [ 
    ...:  {'col': 'Bank_Acct Firstname', 'func': pd.Series.nunique}, 
    ...:  {'col': 'Bank_Acct Lastname', 'func': pd.Series.nunique}, 
    ...:  {'col': 'Bank_AcctNumber', 'func': lambda x: x.value_counts().to_dict()}, 
    ...:  {'col': 'Firstname', 'func': pd.Series.nunique}, 
    ...:  {'col': 'Lastname', 'func': pd.Series.nunique} 
    ...:  ] 

In [16]: df.groupby('ID').apply(lambda x: tuple(c['func'](x[c['col']]) for c in cols)) 
Out[16]: 
ID 
12   (2, 2, {123: 2, 245: 1}, 2, 1) 
13 (3, 3, {356: 1, 478: 1, 599: 1}, 2, 3) 
dtype: object 

In [17]: (df.groupby('ID') 
      .apply(lambda x: tuple(c['func'](x[c['col']]) for c in cols)) 
      .to_dict()) 
Out[17]: 
{12: (2, 2, {123: 2, 245: 1}, 2, 1), 
13: (3, 3, {356: 1, 478: 1, 599: 1}, 2, 3)} 
+0

であなたの列と関数を定義することができます。これをもっと速くする方法はありますか?私は巨大なデータフレームを持っています。 – akrama81

関連する問題