簡體   English   中英

從所有其他行中減去每一行並在 python 中查看矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM