pandas groupby 并获取所有空行,直到多列中的第一个非空值

标签 pandas dataframe pandas-groupby

我正在尝试使用 group by 获取某个值上方的所有空行。

因此,例如给出以下数据框。

+----+------------+-----------+--------+----------+--------+----------+
| ID | Start Date | End Date  | Date_D | D-Values | Date_R | R-Values |
+----+------------+-----------+--------+----------+--------+----------+
| A  | 2/26/2015  | 5/26/2015 | JAN_15 |        - | 15-Jan |        - |
| A  | 2/26/2015  | 5/26/2015 | FEB_15 |        - | 15-Feb |        - |
| A  | 2/26/2015  | 5/26/2015 | MAR_15 |        - | 15-Mar |        - |
| A  | 2/26/2015  | 5/26/2015 | APR_15 |        - | 15-Apr |        - |
| A  | 2/26/2015  | 5/26/2015 | MAY_15 |      -28 | 15-May |    15000 |
| A  | 2/26/2015  | 5/26/2015 | JUN_15 |        - | 15-Jun |        - |
| A  | 2/26/2015  | 5/26/2015 | JUL_15 |        - | 15-Jul |        - |
| A  | 2/26/2015  | 5/26/2015 | AUG_15 |        - | 15-Aug |        - |
+----+------------+-----------+--------+----------+--------+----------+

我想要的输出如下所示。

+----+------------+-----------+--------+----------+--------+----------+
| ID | Start Date | End Date  | Date_D | D-Values | Date_R | R-Values |
+----+------------+-----------+--------+----------+--------+----------+
| A  | 2/26/2015  | 5/26/2015 | FEB_15 |        - | 15-Feb |        - |
| A  | 2/26/2015  | 5/26/2015 | MAR_15 |        - | 15-Mar |        - |
| A  | 2/26/2015  | 5/26/2015 | APR_15 |        - | 15-Apr |        - |
| A  | 2/26/2015  | 5/26/2015 | MAY_15 |      -28 | 15-May |    15000 |
+----+------------+-----------+--------+----------+--------+----------+

编辑

有多个 ID,因此需要在多个客户上实现。 想要基于开始日期和结束日期的行,例如开始选择从 Feb_15 到日期范围内最后一个非空值的行。

最佳答案

使用DataFrame.isna()Series.cumprod()首先检查不为空:

df[df[['D-Values','R-Values']]
     #.replace('-', np.nan) # if necessary
     .isna()
     .any(axis=1)
     .groupby(df['ID'])
     .cumprod()
     .groupby(df['ID'])
     .shift(fill_value=True)
     .astype(bool) 
    & df['Date_D'].eq('FEB_15')
                  #.groupby(df['ID']) # BY ID
                  .cummax()
                  .eq(1) 
   ]

关于pandas groupby 并获取所有空行,直到多列中的第一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71296867/

相关文章:

python - Pandas 保存时添加一个空列

python - 查询字符串值的数据框列

python - Pandas 聚合组

python - 如何将键值对分布在多个列上并基于另一列展平矩阵?

python - Pandas 分组加权累计总和

python - 将 Pandas GroupBy 输出从 Series 转换为 DataFrame

python - 如何使用 foreach 更改 pandas 数据框列?

python - 修改函数以返回具有指定值的数据帧

python - 查找数据帧行中值变为负值的位置并返回相应的列

python - 基于值超过阈值的 Pandas 重采样