gpt4 book ai didi

python - Pandas:上次列具有非 nan 值时

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:44 25 4
gpt4 key购买 nike

假设我有以下数据框:

df = pd.DataFrame({"id": [1, 1, 1, 2, 2], "nominal": [1, np.nan, 1, 1, np.nan], "numeric1": [3, np.nan, np.nan, 7, np.nan], "numeric2": [2, 3, np.nan, 2, np.nan], "numeric3": [np.nan, 2, np.nan, np.nan, 3], "date":[pd.Timestamp(2005, 6, 22), pd.Timestamp(2006, 2, 11), pd.Timestamp(2008, 9, 13), pd.Timestamp(2009, 5, 12), pd.Timestamp(2010, 5, 9)]})

作为输出,我想要一个数据框,它将指示自从为该列(对于该 id)看到非 nan 值以来已经过去的天数。如果列具有对应日期的值,或者如果列在开始时没有新 id 的值,则该值应为 0。此外,这应该是仅为数字列计算。话虽如此,输出数据帧应该是:

output_df = pd.DataFrame({"numeric1_delta": [0, 234, 1179, 0, 362], "numeric2_delta": [0, 0, 945, 0, 362], "numeric3_delta": [0, 0, 945, 0, 0]})

期待您的回答!

最佳答案

可以groupby非null的cumsum,然后减去第一个日期:

In [11]: df.numeric1.notnull().cumsum()
Out[11]:
0 1
1 1
2 1
3 2
4 2
Name: numeric1, dtype: int64

In [12]: df.groupby(df.numeric1.notnull().cumsum()).date.transform(lambda x: x.iloc[0])
Out[12]:
0 2005-06-22
1 2005-06-22
2 2005-06-22
3 2009-05-12
4 2009-05-12
Name: date, dtype: datetime64[ns]

In [13]: df.date - df.groupby(df.numeric1.notnull().cumsum()).date.transform(lambda x: x.iloc[0])
Out[13]:
0 0 days
1 234 days
2 1179 days
3 0 days
4 362 days
Name: date, dtype: timedelta64[ns]

对于多列:

ncols = [col for col in df.columns if col.startswith("numeric")]

for c in ncols:
df[c + "_delta"] = df.date - df.groupby(df[c].notnull().cumsum()).date.transform('first')

关于python - Pandas:上次列具有非 nan 值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54915915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com