如何使用 NaN 值计算 pandas 中的时间差
How to calculate time-difference in pandas with NaN-values
我对 Pandas 比较陌生,已经尝试过搜索,但找不到解决方案。
我有一个包含交易号、客户 ID 和购买日期的数据框,如下所示:
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 ...
我正在努力获取包含每个 customerId 的日期差异的列表。
有没有办法忽略数据框中的 NaN 并仅计算非 NaN 的值?
我想要一个列表,其中包含 customerId 以及购买 1 和 2、2 和 3 之间的日期差异等,以估计下一次购买发生的天数。
有解决办法吗?
想法是通过 DataFrame.stack
重塑数据,然后获取差异,删除每组的第一个缺失值并重塑回来:
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
编辑:如果输入数据不同,则更改解决方案 - 将列转换为日期时间,按 DataFrameGroupBy.diff
for differencies, remove only NaN
rows by DataFrame.dropna
and last reshape with DataFrame.set_index
and unstack
with counter Series
by GroupBy.cumcount
创建新列:
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
我对 Pandas 比较陌生,已经尝试过搜索,但找不到解决方案。 我有一个包含交易号、客户 ID 和购买日期的数据框,如下所示:
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 ...
我正在努力获取包含每个 customerId 的日期差异的列表。 有没有办法忽略数据框中的 NaN 并仅计算非 NaN 的值? 我想要一个列表,其中包含 customerId 以及购买 1 和 2、2 和 3 之间的日期差异等,以估计下一次购买发生的天数。
有解决办法吗?
想法是通过 DataFrame.stack
重塑数据,然后获取差异,删除每组的第一个缺失值并重塑回来:
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
编辑:如果输入数据不同,则更改解决方案 - 将列转换为日期时间,按 DataFrameGroupBy.diff
for differencies, remove only NaN
rows by DataFrame.dropna
and last reshape with DataFrame.set_index
and unstack
with counter Series
by GroupBy.cumcount
创建新列:
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