Python 如何用NaN值计算熊猫的时差
我对熊猫比较陌生,已经尝试过搜索,但我找不到解决办法。 我有一个带有交易编号、customerId和购买日期的数据框,如下所示:Python 如何用NaN值计算熊猫的时差,python,pandas,nan,Python,Pandas,Nan,我对熊猫比较陌生,已经尝试过搜索,但我找不到解决办法。 我有一个带有交易编号、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
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之间,等等,以估计下一次购买之前的天数
有解决方案吗?想法是通过以下方式重新塑造数据,然后获得差异,删除每个组的第一个缺失值,然后重新塑造:
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
by:
谢谢你。我将查看堆栈文档以获得关于它的简要想法,但是您的建议抛出了keyrerror:“Transaction”。我哪里出错了?@miner-如果使用
customerID
而不是Transaction
,工作情况如何?是否有方法计算pandas中的列?数据源是一个带有事务、customerId和日期的csv文件,因此我将所有事务都放在一行中。但这意味着,例如,我有20行customerid123和不同的事务编号,以及dates@miner-不理解,预期输出不同?你能编辑有问题的预期输出吗?不,预期输出如我的问题中所述。但初始数据源是一个csv文件,其中包含coulumns“Transaction”、“customerId”和“Date”。该示例几乎有20k行,每个事务一行。
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