根据Pandas上的日期范围条件合并行并求和

o8x7eapl  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个Pandas数据框,其中包括人力资源数据。对于每个人,有一些记录,我想合并的基础上'VALID_FROM'列。每行应包含一个单一的VALID_FROM与多个VALID_TO和CODE值。
下面是我正在研究的一个例子:

ID      NAME   FAMILY  VALID_FROM   VALID_TO    CODE

000     Mike   Jones   2023-03-01   2260-01-01  115
000     Mike   Jones   2023-03-01   2260-01-01  102
000     Mike   Jones   2022-11-01   2023-02-28  102
000     Mike   Jones   2023-03-01   2260-01-01  101
000     Mike   Jones   2022-10-01   2022-10-31  102
000     Mike   Jones   2022-10-01   2022-10-31  115
000     Mike   Jones   2022-11-01   2023-02-28  115
000     Mike   Jones   2022-10-01   2023-02-28  101

这是我想要的

ID      NAME   FAMILY  VALID_FROM_1   VALID_TO_1  CODE_1 VALID_TO_2  CODE_2 VALID_TO_3 CODE_3

000     Mike   Jones   2022-10-01     2022-10-31  102    2022-10-31  115    2023-02-28 101
000     Mike   Jones   2022-11-01     2023-02-28  102    2023-02-28  115    n/a        n/a
000     Mike   Jones   2023-03-01     2260-01-01  101    2260-01-01  102    2260-01-01 115

解决这个问题的最好方法是什么?我已经研究过groupby()函数,但我仍然不太理解它。

cnh2zyt3

cnh2zyt31#

您可以尝试使用df Dataframe 执行以下操作:

from itertools import chain

group = ["ID", "NAME", "FAMILY", "VALID_FROM"]
df = (
    df
    .sort_values(["VALID_FROM", "VALID_TO","CODE"])
    .assign(COUNT=lambda df: df.groupby(group).transform("cumcount") + 1)
    .pivot(index=group, columns="COUNT")
)
print(df)
df.columns = [f"{c}_{n}" for c, n in df.columns]
result = df[chain(*zip(df.columns[:3], df.columns[3:]))].reset_index()

您的样本结果:

ID  NAME FAMILY  VALID_FROM  VALID_TO_1  CODE_1  VALID_TO_2  CODE_2  \
0   0  Mike  Jones  2022-10-01  2022-10-31   102.0  2022-10-31   115.0   
1   0  Mike  Jones  2022-11-01  2023-02-28   102.0  2023-02-28   115.0   
2   0  Mike  Jones  2023-03-01  2260-01-01   101.0  2260-01-01   102.0   

   VALID_TO_3  CODE_3  
0  2023-02-28   101.0  
1         NaN     NaN  
2  2260-01-01   115.0

相关问题