Dataframe groupby修改内容的两种方法

本文介绍了使用Pandas进行数据分组的两种方法:通过遍历groupby对象进行操作和将groupby结果转换为字典后再操作。第一种方法适用于需要对所有分组进行相同操作的场景,而第二种方法则更适合直接修改groupby后的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方法

遍历groupby中的每一个组,将group对象(元组)的第二个元素取出来存为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

第二种方法

将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

对比分析一下,第二种方法需要清楚的知道分组键是什么,才能进行调用,如果分组键比较多且需要对所有的分组都进行同样的操作的话,第一种方法比较快捷。然而,如果是想直接对groupby后的内容进行修改的话,第二种方法比较好。

### 解决 Python Pandas Group By 后列名显示为两行的方法 当使用 `groupby` 并应用聚合函数后,有时会遇到返回的数据框具有多层次索引的情况,这会导致列名显示成两行。为了修正这一现象并使列名保持单行展示,可以采用多种方法。 #### 方法一:重命名列并将多重索引展平 通过连接各层名称来创建新的单一层次列标签是一种常见做法: ```python import pandas as pd # 创建示例 DataFrame df = pd.DataFrame({ 'a': [1, 3, 3, 3, 4], 'b': [1, 3, 3, 3, 40], 'c': [2, 5, 2, 4, 100], 'd': [2, 5, 41, 3, 100] }) # 执行 groupby 和 count 操作 df_grouped = df.groupby(['a', 'b']).agg({'c': 'count', 'd': 'count'}) # 展开 MultiIndex 列名为单级索引,并加入原始分组依据作为新列 df_result = df_grouped.add_suffix('_count').reset_index() print(df_result) ``` 这种方法利用了 `.add_suffix()` 函数给每一列追加特定字符串,从而避免重复的列名;接着调用 `.reset_index()` 将原来的分组键转换回普通列[^2]。 #### 方法二:直接修改列名属性 另一种方式是在获取结果之后立即调整其`.columns` 属性,将其设置为由原有多层次结构组合而成的新列表: ```python # 假设已经得到了带有双重索引列的结果 data frame count3 = ... # 使用 join 连接各级别的名字形成一个新的简单列表形式的名字集合 count3.columns = ['_'.join(map(str, col)) for col in count3.columns] # 移除多余的 index level 如果有的话 count3 = count3.reset_index() ``` 这段代码遍历所有的多级别列名,并将它们拼接到一起作为一个单独级别的字符串表示,最后同样地恢复默认整数型索引[^3]。 这两种方案都可以有效地解决由于 `groupby` 导致的双行列头问题,具体选择取决于个人偏好以及实际应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值