[英]subtract each row from all other rows and view as matrix in python
我有這樣的df:
id date
1 01-02-2013
2 01-06-2013
3 05-31-2013
4 07-06-2013
我想建立一個矩陣,顯示每個 id 的我,特定 id 與所有其他人之間經過的時間(以天為單位)。 即是這樣的:
1 2 3 4
1 0 4 -149 -185
2 4 0 -145 -181
....
謝謝
df['date'] = pd.to_datetime(df['date'])
df.set_index('id', inplace=True)
您可以從其中的每個值中減去日期列的所有值,最終結果是:
df['date'].apply(lambda x:x-df['date'])
id 1 2 3 4
id
1 0 days -4 days -149 days -185 days
2 4 days 0 days -145 days -181 days
3 149 days 145 days 0 days -36 days
4 185 days 181 days 36 days 0 days
如果您不想顯示days
字符串,您可以使用dt.days
屬性來訪問天數:
df['date'].apply(lambda x:x-df['date']).apply(lambda x: x.dt.days)
id 1 2 3 4
id
1 0 -4 -149 -185
2 4 0 -145 -181
3 149 145 0 -36
4 185 181 36 0
如果要獲取 numpy 數組,您最終可以使用.values
屬性:
df['date'].apply(lambda x:x-df['date']).apply(lambda x: x.dt.days).values
array([[ 0, -4, -149, -185],
[ 4, 0, -145, -181],
[ 149, 145, 0, -36],
[ 185, 181, 36, 0]], dtype=int64)
使用 numpy 的廣播* :
values = df.date.to_numpy()
diff = (values[:, np.newaxis] - values).astype("timedelta64[D]")
要得到
>>> diff
array([[ 0, -4, -149, -185],
[ 4, 0, -145, -181],
[ 149, 145, 0, -36],
[ 185, 181, 36, 0]], dtype="timedelta64[D]")
轉換回 dataframe:
>>> pd.DataFrame(diff, index=df.id, columns=df.id)
id 1 2 3 4
id
1 0 days -4 days -149 days -185 days
2 4 days 0 days -145 days -181 days
3 149 days 145 days 0 days -36 days
4 185 days 181 days 36 days 0 days
* : 你可以看到這張圖片的最后一行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.