![](/img/trans.png)
[英]pd.merge_asof() based on Time-Difference not merging all values - 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
創建新列以獲取差異,通過DataFrame.dropna
僅刪除NaN
行,最后使用DataFrame.set_index
重新DataFrame.set_index
並通過GroupBy.cumcount
使用計數器Series
DataFrame.set_index
unstack
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.