【问题标题】:Creating a column that calculates the difference between each new row创建一个计算每个新行之间差异的列
【发布时间】:2018-08-10 20:30:05
【问题描述】:

我有一个包含一些日期的数据框,以及我从 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

【问题讨论】:

  • 使用从 datetime 导入的 timedelta。阅读this

标签: python pandas numpy


【解决方案1】:

编辑回答 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

方法一: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

方法二: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

【讨论】:

  • 类似地,如果我的数据在每个日期都有多个值怎么办?我仍然想检查日期之间的差异,但希望给定日期的每一行都具有相同的日期差异值。例如,在我提供的 df 中,如果行 [0,1,2] 是一个日期,而行 [3,4] 是另一个日期,我希望行 [0, 1,2]以及第二组行的日期与第一组行的日期之间的差异[3,4]
猜你喜欢
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
相关资源
最近更新 更多