簡體   English   中英

創建一個計算每個新行之間差異的列

[英]Creating a column that calculates the difference between each new row

我有一個帶有一些日期的數據框,以及我從csv文件中讀取的每個日期的相關數據(文件相對較小,大小為10,000行,大約10列):

memid   date        a   b
10000   7/3/2017    221 143
10001   7/4/2017    442 144
10002   7/6/2017    132 145
10003   7/8/2017    742 146
10004   7/10/2017   149 147

我想在此數據框中添加一列“date_diff”,用於計算每個日期與之前最近日期之間的天數(行始終按日期排序):

memid   date        a   b    date_diff
10000   7/3/2017    221 143  NaN
10001   7/4/2017    442 144  1
10002   7/6/2017    132 145  2
10003   7/8/2017    742 146  2
10004   7/11/2017   149 147  3

我很難找到一個創建這個“date_diff”列的好方法,因為當使用pandas / numpy時,逐行迭代往往會不受歡迎。 有沒有一種簡單的方法可以在python / pandas / numpy中創建這個列,或者在將csv讀入我的腳本之前更好地完成這項工作?

謝謝!

編輯:感謝jpp和Tai的回答。 它涵蓋了原始問題,但我有一個跟進:

如果我的數據集每個日期有多行,該怎么辦? 有沒有辦法輕松檢查每組日期之間的差異,以產生如下例所示的輸出? 如果每個日期有一定數量的行,是否更容易?

 memid  date        a   b   date_diff
 10000  7/3/2017    221 143 NaN
 10001  7/3/2017    442 144 NaN
 10002  7/4/2017    132 145 1
 10003  7/4/2017    742 146 1
 10004  7/6/2017    149 147 2
 10005  7/6/2017    457 148 2

編輯以回答OP的新問題:如果date列中有重復項,該怎么辦?

設置:創建不包含重復項的df

df.date = pd.to_datetime(df.date, infer_datetime_format=True) 
df_no_dup = df.drop_duplicates("date").copy()
df_no_dup["diff"] = df_no_dup["date"].diff().dt.days

方法1: merge

df.merge(df_no_dup[["date", "diff"]], left_on="date", right_on="date", how="left")

    memid   date        a   b   diff
0   10000   2017-07-03  221 143 NaN
1   10001   2017-07-03  442 144 NaN
2   10002   2017-07-04  132 145 1.0
3   10003   2017-07-04  742 146 1.0
4   10004   2017-07-06  149 147 2.0
5   10005   2017-07-06  457 148 2.0

方法2: map

df["diff"] = df["date"].map(df_no_dup.set_index("date")["diff"])

嘗試這個。

df.date = pd.to_datetime(df.date, infer_datetime_format=True)
df.date.diff()

0      NaT
1   1 days
2   2 days
3   2 days
4   2 days
Name: date, dtype: timedelta64[ns]

要轉換為整數:

df['diff'] = df['date'].diff() / np.timedelta64(1, 'D')

#    memid       date    a    b  diff
# 0  10000 2017-07-03  221  143   NaN
# 1  10001 2017-07-04  442  144   1.0
# 2  10002 2017-07-06  132  145   2.0
# 3  10003 2017-07-08  742  146   2.0
# 4  10004 2017-07-10  149  147   2.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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