groupby在dataframe中的应用

转载:https://zhuanlan.zhihu.com/p/101284491
总结非常好的资料!

1、想要实现按照某一列先分组,然后统计个数,并将个数添加在原数据最后一列:data['avg_salary'] = data.groupby('company')['salary'].transform('mean')

df['count'] = df.groupby(['A', 'B'])['B'].transform('count')

比如分组计算每组数据的最小值,然后所有值减去最小值:

df['height_min'] = df.groupby('FID')['HEIGHT'].transform('min')
df['dif_min_h'] = df['HEIGHT']-df['height_min']

2、apply函数
对dataframe分组后,每组数据进行相同的操作:

def get_oldest_staff(x):
   df = x.sort_values(by = 'age',ascending=True)
   return df.iloc[-1,:]
oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)

3、dataframe如果两行数据的某两列都相等,那提取这两行数据,并将两行数据作差:
在这里插入图片描述
代码:

import pandas as pd

# 创建一个示例DataFrame
df = pd.DataFrame({'A': [1, 2, 3, 2], 'B': [4, 5, 6, 5], 'C': [7, 8, 9, 10]})

# 选择要比较的两列A和B
cols_to_compare = ['A', 'B']

# 找到重复行并保留
duplicate_rows = df[df.duplicated(subset=cols_to_compare, keep=False)]

# 从原始数据中选取重复行并进行数据处理
result = duplicate_rows.groupby(cols_to_compare).apply(lambda x: x.max() - x.min())

# 打印结果
print(result)

或者直接使用:diffs = df.groupby(['col1', 'col2'])[col_to_subtract].apply(lambda x: x.diff())
4、按照某一列分组,然后分别计算mean 和std,并输出dataframe

import pandas as pd

# 创建示例DataFrame
df = pd.DataFrame({
   'group': ['A', 'B', 'A', 'B', 'A'],
   'value': [1, 2, 3, 4, 5]
})

# 按照'group'列进行分组,计算'value'列的均值和标准差
result = df.groupby('group').agg({'value': ['mean', 'std']})

# 将结果保存为新的DataFrame
new_df = pd.DataFrame({'group': result.index.tolist(),
                       'mean_value': result[('value', 'mean')].tolist(),
                       'std_value': result[('value', 'std')].tolist()})

print(new_df)

5、两个dataframe,如果一个dataframe的一列在另一个dataframe中的另一列中可以找到,则将这行数据的其他信息复制过来(常常用在查找相对应的点,添加数据的经纬度信息,类似Arcgis中的关联)
代码:

import pandas as pd

# 创建两个 DataFrame
df1 = pd.DataFrame({
    '名称': ['苹果', '香蕉', '橙子', '猕猴桃'],
    '价格': [5, 3, 2, 6]
})

df2 = pd.DataFrame({
    '水果': ['苹果', '香蕉', '西瓜', '草莓'],
    '产地': ['中国', '泰国', '美国', '日本']
})

# 合并两个 DataFrame
merged = pd.merge(df1, df2, left_on='名称', right_on='水果', how='left')

# 过滤出符合条件的数据行
filtered = merged.loc[~pd.isnull(merged['产地']), :]

# 复制数据
filtered.loc[:, '价格'] = filtered.loc[:, '价格'] * 2

print(filtered)

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值