如何用NanV值计算Pandas的时差

2024-10-03 23:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫比较陌生,已经尝试过搜索,但我找不到解决办法。 我有一个带有交易编号、customerId和购买日期的数据框,如下所示:

Transaction   12345    12346       12347     12348       12349
customerID
1             NaN    2019-09-01    NaN     2019-09-11      2019-09-22...
2           2019-10-01 NaN         NaN         NaN      2019-10-07...
3    ...

数据帧有[6334行x 8557列]。 每行都有NaN值,因为事务编号是唯一的

我想计算每行的日期差,以便

customerID    Datedifference1    Datedifference2     etc.
1                10                    11
2                 6
3   ...

我很难得到一个每个客户ID的日期差异列表。 有没有一种方法可以忽略数据帧中的NaN,而只计算非NaN的值? 我想有一个带有customerId和datediff的列表,在购买1和2之间,2和3之间,等等,以估计下一次购买之前的天数

有解决办法吗


Tags: 数据列表客户etc交易nan事务编号
1条回答
网友
1楼 · 发布于 2024-10-03 23:17:58

想法是通过^{}重新塑造数据,然后获得差异,删除每个组的第一个缺失值并重新塑造:

df = df.apply(pd.to_datetime)

df1 = (df.stack()
         .groupby(level=0)
         .diff()
         .dropna()
         .dt.days
         .reset_index(level=1, drop=True)
         .to_frame())

df1 = (df1.set_index(df1.groupby(['customerID']).cumcount(), append=True)[0]
          .unstack()
          .add_prefix('Datedifference'))
print (df1)
             Datedifference0  Datedifference1
Transaction                                  
1                       10.0             11.0
2                        6.0              NaN

编辑:如果输入数据不同,解决方案将更改-将列转换为日期时间,通过^{}为差异创建新列,通过^{}仅删除NaN行,最后通过^{}unstack通过Series计数器^{}重新整形:

print (df1)
   customerID Transaction       date
0           1       12346 2019-09-01
1           1       12348 2019-09-11
2           1       12349 2019-09-22
3           2       12345 2019-10-01
4           2       12349 2019-10-07

df1['date'] = pd.to_datetime(df1['date'])
df1['diff'] = df1.groupby('customerID')['date'].diff().dt.days
df1 = df1.dropna(subset=['diff'])

df2 = (df1.set_index(['customerID', df1.groupby('customerID').cumcount()])['diff']
          .unstack()
          .add_prefix('Datedifference'))
print (df2)
            Datedifference0  Datedifference1
customerID                                  
1                      10.0             11.0
2                       6.0              NaN

相关问题 更多 >