转载: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)