我是Pandas 的初学者.
我有一个类似下面的数据框,我想计算从每个"ID"的"访问"开始的"CV"天数差,作为预期结果中的"CV_Days_After_Access".
我可以知道如何使用Pandas来实现这一点吗?

import pandas as pd
data1 = {'ID': ['A2A', 'A2A', 'A2A', 'BB3', 'BB3', 'BB3', '5EE', '5EE'], 'Action': ['Visit', 'CV', 'CV', 'Visit', 'Visit', 'CV', 'Visit', 'CV'], 'date': ['2023/4/1', '2023/4/5', '2023/4/7', '2023/5/5', '2023/5/29', '2023/5/30', '2023/6/1', '2023/6/10']}
df = pd.DataFrame(data1)

print (df)
    ID  Acton       date
0  A2A  Visit   2023/4/1
1  A2A     CV   2023/4/5
2  A2A     CV   2023/4/7
3  BB3  Visit   2023/5/5
4  BB3  Visit  2023/5/29
5  BB3     CV  2023/5/30
6  5EE  Visit   2023/6/1
7  5EE     CV  2023/6/10

enter image description here

先谢谢你.

推荐答案

您可以将正向填充日期减go GroupBy.ffill,如果是Visit,则减go Series.sub,并将时间增量转换为Series.dt.days的天数,最后,如果需要,将0天减go Series.mask:

#convert column to datetimes
df['date'] = pd.to_datetime(df['date'])

m = df['Acton'].eq('Visit')
df['CV_days_after_visit'] = (df['date'].sub(df['date'].where(m).groupby(df['ID']).ffill())
                                       .dt.days
                                       .mask(m))
print (df)
    ID  Acton       date  CV_days_after_visit
0  A2A  Visit 2023-04-01                  NaN
1  A2A     CV 2023-04-05                  4.0
2  A2A     CV 2023-04-07                  6.0
3  BB3  Visit 2023-05-05                  NaN
4  BB3  Visit 2023-05-29                  NaN
5  BB3     CV 2023-05-30                  1.0
6  5EE  Visit 2023-06-01                  NaN
7  5EE     CV 2023-06-10                  9.0

它的工作原理:

df['date'] = pd.to_datetime(df['date'])

m = df['Acton'].eq('Visit')

print (df.assign(m1 = df['date'].where(m),
                 ffill = df['date'].where(m).groupby(df['ID']).ffill(),
                 sub = df['date'].sub(df['date'].where(m).groupby(df['ID']).ffill()),
                 days = df['date'].sub(df['date'].where(m).groupby(df['ID']).ffill())
                                  .dt.days))

    ID  Acton       date         m1      ffill    sub  days
0  A2A  Visit 2023-04-01 2023-04-01 2023-04-01 0 days     0
1  A2A     CV 2023-04-05        NaT 2023-04-01 4 days     4
2  A2A     CV 2023-04-07        NaT 2023-04-01 6 days     6
3  BB3  Visit 2023-05-05 2023-05-05 2023-05-05 0 days     0
4  BB3  Visit 2023-05-29 2023-05-29 2023-05-29 0 days     0
5  BB3     CV 2023-05-30        NaT 2023-05-29 1 days     1
6  5EE  Visit 2023-06-01 2023-06-01 2023-06-01 0 days     0
7  5EE     CV 2023-06-10        NaT 2023-06-01 9 days     9

Python相关问答推荐

在Python中对分层父/子列表进行排序

使用mySQL的SQlalchemy过滤重叠时间段

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

pyscript中的压痕问题

如何让这个星型模式在Python中只使用一个for循环?

当递归函数的返回值未绑定到变量时,非局部变量不更新:

Scrapy和Great Expectations(great_expectations)—不合作

未知依赖项pin—1阻止conda安装""

让函数调用方程

考虑到同一天和前2天的前2个数值,如何估算电力时间序列数据中的缺失值?

使用BeautifulSoup抓取所有链接

如何在PySide/Qt QColumbnView中删除列

为什么if2/if3会提供两种不同的输出?

具有相同图例 colored颜色 和标签的堆叠子图

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

在极点中读取、扫描和接收有什么不同?

python的文件. truncate()意外地没有截断'

合并Pandas中的数据帧,但处理不存在的列

如何在微调Whisper模型时更改数据集?

如何使用count()获取特定日期之间的项目