首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中基于日期的DataFrame值计算?

在Pandas中基于日期的DataFrame值计算?
EN

Stack Overflow用户
提问于 2020-12-16 11:29:11
回答 2查看 54关注 0票数 2

我有DataFrame与客户的协议如下:

代码语言:javascript
复制
rng = pd.date_range('2020-12-01', periods=5, freq='D')
df = pd.DataFrame({ "ID" : ["1", "2", "1", "2", "2"],
                   "value" : [100, 200, 300, 400, 500],
                   "status" : ["active", "finished", "active", "finished", "active"],
                   "Date": rng})

我需要创建基于以上df计算的新DataFrame:

  1. New1 =状态“活动”的最后协议的值
  2. New2=与状态的最后协议的值“已完成的”

为了更精确,我需要创建如下所示的df:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-16 11:33:36

DataFrame.sort_values与具有聚合函数lastDataFrame.pivot_table按两列一起使用

代码语言:javascript
复制
df = (df.sort_values(['ID','Date'])
        .pivot_table(index='ID', columns='status', values='value', aggfunc='last')
        .rename(columns={'active':'New1','finished':'New2'})[['New1','New2']]
        .reset_index()
        .rename_axis(None,axis=1)
       )
print (df)
  ID   New1   New2
0  1  300.0    NaN
1  2  500.0  400.0

如果按组对日期时间进行排序,则解决方案更简单:

代码语言:javascript
复制
df = (df.pivot_table(index='ID', columns='status', values='value', aggfunc='last')
        .rename(columns={'active':'New1','finished':'New2'})[['New1','New2']]
        .reset_index()
        .rename_axis(None,axis=1)
       )
print (df)
票数 2
EN

Stack Overflow用户

发布于 2020-12-16 11:39:15

试着用这个长的:

代码语言:javascript
复制
df1 = df.loc[df['status'] == "active"]
df2 = df.loc[df['status'] == "finished"]
df1 = df1.groupby("ID")['value'].last()
df2 = df2.groupby("ID")['value'].last()
IDs = df["ID"].drop_duplicates()
new_df = pd.DataFrame({"ID": IDs, "New1": df1.reindex(IDs).tolist(), "New2": df2.reindex(IDs).tolist()})
print(new_df)

输出:

代码语言:javascript
复制
  ID  New1   New2
0  1   300    NaN
1  2   500  400.0
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65322384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档