Pandas 列对连续行执行最大/最小操作
Posted
技术标签:
【中文标题】Pandas 列对连续行执行最大/最小操作【英文标题】:Pandas column perform max/min operation on continous rows 【发布时间】:2022-01-07 23:22:24 【问题描述】:我正在尝试在薪水栏上设置最高金额,在费用栏上设置最低金额 对于连续有效数字(非空值)
我尝试迭代行但无法正常工作,正在寻找熊猫方式的解决方案。
Name date salary expense
Ram 10 1000 NaN
Ram 12 8000 NaN
Ram 13 NaN 500
Ram 14 NaN 800
Ram 15 3000 NaN
我的预期输出会是这样,
Name date salary expense
Ram 12 8000 NaN
Ram 13 NaN 500
Ram 15 3000 NaN
【问题讨论】:
到目前为止你尝试了什么? df.iterrows 带有 for 循环但正在寻找 pandas 解决方案 请用您的 iterrows 尝试更新您的问题 工资和费用总是排他性的吗?如果没有,你能提供这个案例的例子吗? 工资和费用不会出现在同一行? 【参考方案1】:假设 'salary' 和 'expense' 排在一行,创建一个自定义组,对值进行排序以获得最高薪水和最低费用,排序后得到每个组的第一行:
group = df['salary'].isna().diff().fillna(False).cumsum()
(df.sort_values(by=['salary', 'expense'], ascending=[False, True])
.groupby(group).first()
.reset_index(drop=True)
)
输出:
Name date salary expense
0 Ram 12 8000.0 NaN
1 Ram 13 NaN 500.0
2 Ram 15 3000.0 NaN
【讨论】:
谢谢你............ 不客气@pyd ;)【参考方案2】:在最后一步中分别处理每列最大和最小值的行的解决方案:
df['g1'] = df['salary'].isna().cumsum()
df['g2'] = df['expense'].isna().cumsum()
df1=df.loc[df.groupby(['Name','g1'])['salary'].idxmax().dropna(),['Name','date','salary']]
df2=df.loc[df.groupby(['Name','g2'])['expense'].idxmin().dropna(),['Name','date','expense']]
df = pd.concat([df1, df2]).sort_index().reset_index(drop=True)
print (df)
Name date salary expense
0 Ram 12 8000.0 NaN
1 Ram 13 NaN 500.0
2 Ram 15 3000.0 NaN
【讨论】:
谢谢@jezrael以上是关于Pandas 列对连续行执行最大/最小操作的主要内容,如果未能解决你的问题,请参考以下文章