如何修改分组 pandas 数据框的组
How to modify groups of a grouped pandas dataframe
我有这个数据框:
s = pd.DataFrame({'A': [*'1112222'], 'B': [*'abcdefg'], 'C': [*'ABCDEFG']})
就是这样:
A B C
0 1 a A
1 1 b B
2 1 c C
3 2 d D
4 2 e E
5 2 f F
6 2 g G
我想像这样进行分组:
groups = s.groupby("A")
例如第2组是:
g2 = groups.get_group("2")
看起来像这样:
A B C
3 2 d D
4 2 e E
5 2 f F
6 2 g G
反正我想在每个组里做点操作
让我展示一下我的最终结果:
A B C D
1 1 b B a=b;A=B
2 1 c C a=c;A=C
4 2 e E d=e;D=E
5 2 f F d=f;F=F
6 2 g G d=g;D=G
实际上,我删除了每个组中的第一行,但将其与组中的其他行组合以创建列 C
知道怎么做吗?
用两行总结我想做的事情:
我想做一个分组,在每个组中,我想删除第一行。我还想向基于组行的整个数据框添加一列
我试过的:
为了解决这个问题,我将创建一个函数:
def func(g):
first_row_of_group = g.iloc[0]
g = g.iloc[1:]
g["C"] = g.apply(lambda row: ";".join([f'{a}={b}' for a, b in zip(row, first_row_of_group)]))
return g
那我要这样做:
groups.apply(lambda g: func(g))
您可以对每个组应用自定义函数,将第一行的元素添加到其余行并将其删除:
def remove_first(x):
first = x.iloc[0]
x = x.iloc[1:]
x['D'] = first['B'] + '=' + x['B'] + ';' + first['C'] + '=' + x['C']
# an equivalent operation
# x['D'] = first.iloc[1] + '=' + x.iloc[:,1] + ';' + first.iloc[2] + '=' + x.iloc[:,2]
return x
s = s.groupby('A').apply(remove_first).droplevel(0)
输出:
A B C D
1 1 b B a=b;A=B
2 1 c C a=c;A=C
4 2 e E d=e;D=E
5 2 f F d=f;D=F
6 2 g G d=g;D=G
注意:您问题中显示的数据框是从
构建的
s = pd.DataFrame({'A': [*'1112222'], 'B': [*'abcdefg'], 'C': [*'ABCDEFG']})
但是你给了一个不同的原始输入。
我有这个数据框:
s = pd.DataFrame({'A': [*'1112222'], 'B': [*'abcdefg'], 'C': [*'ABCDEFG']})
就是这样:
A B C
0 1 a A
1 1 b B
2 1 c C
3 2 d D
4 2 e E
5 2 f F
6 2 g G
我想像这样进行分组:
groups = s.groupby("A")
例如第2组是:
g2 = groups.get_group("2")
看起来像这样:
A B C
3 2 d D
4 2 e E
5 2 f F
6 2 g G
反正我想在每个组里做点操作
让我展示一下我的最终结果:
A B C D
1 1 b B a=b;A=B
2 1 c C a=c;A=C
4 2 e E d=e;D=E
5 2 f F d=f;F=F
6 2 g G d=g;D=G
实际上,我删除了每个组中的第一行,但将其与组中的其他行组合以创建列 C
知道怎么做吗?
用两行总结我想做的事情: 我想做一个分组,在每个组中,我想删除第一行。我还想向基于组行的整个数据框添加一列
我试过的:
为了解决这个问题,我将创建一个函数:
def func(g):
first_row_of_group = g.iloc[0]
g = g.iloc[1:]
g["C"] = g.apply(lambda row: ";".join([f'{a}={b}' for a, b in zip(row, first_row_of_group)]))
return g
那我要这样做:
groups.apply(lambda g: func(g))
您可以对每个组应用自定义函数,将第一行的元素添加到其余行并将其删除:
def remove_first(x):
first = x.iloc[0]
x = x.iloc[1:]
x['D'] = first['B'] + '=' + x['B'] + ';' + first['C'] + '=' + x['C']
# an equivalent operation
# x['D'] = first.iloc[1] + '=' + x.iloc[:,1] + ';' + first.iloc[2] + '=' + x.iloc[:,2]
return x
s = s.groupby('A').apply(remove_first).droplevel(0)
输出:
A B C D
1 1 b B a=b;A=B
2 1 c C a=c;A=C
4 2 e E d=e;D=E
5 2 f F d=f;D=F
6 2 g G d=g;D=G
注意:您问题中显示的数据框是从
构建的s = pd.DataFrame({'A': [*'1112222'], 'B': [*'abcdefg'], 'C': [*'ABCDEFG']})
但是你给了一个不同的原始输入。