首页 > 解决方案 > 如何创建列并通过 for 循环更改其值?

问题描述

我是 python 和 pandas 的新手。我搜索了许多关于如何按条件更改日期帧值的帖子。但是,如果我得到一个有很多条件的数据框怎么办?

我有以下数据框:

import pandas as pd
import datetime as dt

data = {"Project":["A","A","A","B","B"], "Date":[dt.datetime(2020,1,1),dt.datetime(2020,3,1),dt.datetime(2020,5,1),dt.datetime(2020,2,1),dt.datetime(2020,4,1)]}
df = pd.DataFrame(data)
    Project Date
0   A       2020-01-01
1   A       2020-03-01
2   A       2020-05-01
3   B       2020-02-01
4   B       2020-04-01

我想得到以下结果:

    Project Date        Start       End
0   A       2020-01-01  2020-01-01  2020-05-01
1   A       2020-03-01  2020-01-01  2020-05-01
2   A       2020-05-01  2020-01-01  2020-05-01
3   B       2020-02-01  2020-02-01  2020-04-01
4   B       2020-04-01  2020-02-01  2020-04-01

我想我可以通过以下方法创建开始和结束列,但我想分别为不同的项目设置开始日期和结束日期。

for i in df['Project']:
    tmp = df[df['Project']== i ]
    df['Start'] = min(tmp['Date'])
    df['End'] = max(tmp['Date'])

    Project Date        Start       End
0   A       2020-01-01  2020-02-01  2020-04-01
1   A       2020-03-01  2020-02-01  2020-04-01
2   A       2020-05-01  2020-02-01  2020-04-01
3   B       2020-02-01  2020-02-01  2020-04-01
4   B       2020-04-01  2020-02-01  2020-04-01

这只是一个简单的例子。如果我有很多项目和日期怎么办?我可以使用 for 循环来检查条件吗?有没有办法做到这一点?非常感谢

标签: pythonpandas

解决方案


您可以使用groupby.transformwithminmaxlike:

gr = df.groupby('Project')['Date'] #create the grouped object
df['Start'] = gr.transform('min')
df['End'] = gr.transform('max')

print (df)
  Project       Date      Start        End
0       A 2020-01-01 2020-01-01 2020-05-01
1       A 2020-03-01 2020-01-01 2020-05-01
2       A 2020-05-01 2020-01-01 2020-05-01
3       B 2020-02-01 2020-02-01 2020-04-01
4       B 2020-04-01 2020-02-01 2020-04-01

或以另一种方式获得groupby.agg相同merge的结果

df = df.merge(df.groupby('Project')['Date']
                .agg([('Start', 'min'), ('End', 'max')]), 
              on='Project', how='left')

推荐阅读