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 列对连续行执行最大/最小操作的主要内容,如果未能解决你的问题,请参考以下文章

pandas cum系列函数

关于 Pandas 聚合器操作 [重复]

Python pandas 字典上的月份分割

使用 Pandas 以更有效的方式在后续行之间应用函数

pandas:将具有相同值的连续行分组为一组

识别 Pandas 中的非连续行