【问题标题】:What's the most efficient way to input this data to a pandas dataframe?将此数据输入熊猫数据框的最有效方法是什么?
【发布时间】:2023-02-08 14:25:56
【问题描述】:

我有一个看起来像这样的数据框(英国日期):

Type Date
1 01/01/2022
2 02/01/2022
3 03/01/2022
1 04/01/2022
2 05/01/2022
2 06/01/2022

我目前正在添加两种类型的列,其中包含一个大的 for 循环。第一个是具有较旧日期的相同类型的行数,第二个是相同类型和较旧日期的最新行与当前行之间的天数(-1,如果没有较旧的行同类型)。

例如,数据框将变为:

Type Date Previous count Days since latest previous
1 01/01/2022 0 -1
2 02/01/2022 0 -1
3 03/01/2022 0 -1
1 04/01/2022 1 3
2 05/01/2022 1 3
2 06/01/2022 2 1

有没有比简单的 for 循环更有效的方法?

【问题讨论】:

  • 根据您以后要对数据执行的操作,您可以使用 df.groupby("Type") 为所有类型创建单独的 DataFrame。那些你可以按日期订购的,你基本上拥有所有信息,因为“以前的计数”将只是一个不断增加的数字。

标签: python pandas


【解决方案1】:

IIUC,你可以这样做:

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

g = df.groupby('Type')['Date']
df['Previous count'] = g.cumcount()
df['Days since latest previous'] = g.diff().fillna('-1').dt.days

输出:

   Type       Date  Previous count  Days since latest previous
0     1 2022-01-01               0                          -1
1     2 2022-01-02               0                          -1
2     3 2022-01-03               0                          -1
3     1 2022-01-04               1                           3
4     2 2022-01-05               1                           3
5     2 2022-01-06               2                           1

注意。我在这里假设输入是按日期排序的

【讨论】:

  • 如果日子重复,那行得通吗?
  • @rammelmueller 不,你需要屏蔽,你能提供一个匹配输出的例子吗,因为有不同的可能性来处理这种情况?
  • 我什至不是问题的作者 - 只是想检查一下。
  • @rammelmueller 糟糕,抱歉:p 是的,在这种情况下,您可以使用 duplicated 屏蔽值以仅计算唯一天数。我想到了,但不知道应该如何处理就无法提供答案;)
  • 感谢您的回答它真的很有帮助!有重复的日期,尽管它们实际上也是按时间排序的。因此,如果两个日期相同且类型相同,则先前的日期应包含在先前的计数中,而距最近的日期应为 0。我认为这在这种情况下可行吗?
【解决方案2】:
gg1=df1.assign(Date=pd.to_datetime(df1.Date,format="%d/%M/%Y")).groupby('Type',sort=False)

col1=gg1.cumcount()
col2=gg1.Date.diff().dt.days.fillna(-1).astype(int)
df1.assign(**{"Previous count":col1,"Days since latest previous":col2})

出去

  Type        Date  Previous count  Days since latest previous
0     1  01/01/2022               0                          -1
1     2  02/01/2022               0                          -1
2     3  03/01/2022               0                          -1
3     1  04/01/2022               1                           3
4     2  05/01/2022               1                           3
5     2  06/01/2022               2                           1

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2011-12-11
    • 2018-09-09
    • 2020-07-24
    • 2019-04-11
    相关资源
    最近更新 更多