Dataframe groupbyコンテンツを変更する2つの方法

17024 ワード

第一の方法
groupbyの各グループを巡回し、groupオブジェクト(メタグループ)の2番目の要素を取り出してdataframeオブジェクトとして保存して操作します.ループでgroupを直接変更してもgroupby後のオブジェクトは変更されません.
df = pd.DataFrame({'A': 'a a b b b'.split(), 'B': [1, 2, 1, 2, 3], 'C': [4, 6, 5, 6, 7]})
print(df)
df = df.groupby(['A'])
f = lambda x: pd.Series([x.B + x.C, x.C - x.B], index=['D', 'F'])
for group in df:
    print(group)
    df1 = group[1]   #        
    print(df1)
    df1[['D', 'F']] = df1.apply(f, axis=1)
    print(df1)

出力結果は
   A  B  C
0  a  1  4
1  a  2  6
2  b  1  5
3  b  2  6
4  b  3  7

('a',    A  B  C
0  a  1  4
1  a  2  6)

   A  B  C
0  a  1  4
1  a  2  6

   A  B  C  D  F
0  a  1  4  5  3
1  a  2  6  8  4

('b',    A  B  C
2  b  1  5
3  b  2  6
4  b  3  7)

   A  B  C
2  b  1  5
3  b  2  6
4  b  3  7

   A  B  C   D  F
2  b  1  5   6  4
3  b  2  6   8  4
4  b  3  7  10  4

第2の方法
Dataframeをgroupbyに変換して辞書に変換し、辞書を値取りした後、dataframeオブジェクトを操作します.この方法は辞書を修正することができる.
df = pd.DataFrame({'A': 'a a b b b'.split(), 'B': [1, 2, 1, 2, 3], 'C': [4, 6, 5, 6, 7]})
print(df)
dict_df = dict(list(df.groupby('A')))
print(dict_df)
a = dict_df['a']
print("print a")
print(a)
a_B = dict_df['a']['B']
print("print a_B")
print(a_B)
f = lambda x: pd.Series([x.B + x.C, x.C - x.B], index=['D', 'F'])
a[['D', 'F']] = a.apply(f, axis=1)
print("print a")
print(a)
#       ‘a’       
dict_df['a'].loc[:, 'D'] = 0
print('print dict_df[''a'']')
print(dict_df['a'])

出力結果は
   A  B  C
0  a  1  4
1  a  2  6
2  b  1  5
3  b  2  6
4  b  3  7
{'a':    A  B  C
0  a  1  4
1  a  2  6, 'b':    A  B  C
2  b  1  5
3  b  2  6
4  b  3  7}
print a
   A  B  C
0  a  1  4
1  a  2  6
print a_B
0    1
1    2
Name: B, dtype: int64
print a
   A  B  C  D  F
0  a  1  4  5  3
1  a  2  6  8  4
print dict_df[a]
   A  B  C  D
0  a  1  4  0
1  a  2  6  0

比較分析すると、第2の方法は、呼び出しを行うためにパケットキーが何であるかを明確に知る必要があり、パケットキーが多く、すべてのパケットに対して同じ操作を行う必要がある場合、第1の方法は比較的迅速である.ただし、groupby以降の内容を直接修正したい場合は、2つ目の方法が良いです.