python - 如何创建列并通过 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 循环来检查条件吗?有没有办法做到这一点?非常感谢
解决方案
您可以使用groupby.transform
withmin
和max
like:
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')
推荐阅读
- angular - “HubConnection”类的构造函数是私有的,只能在类声明中访问
- javascript - `Vue 未定义`错误
- android - 安装英特尔 haxm android
- javascript - 如何在地图函数内进行异步调用后更新状态?
- python - 如何从现有模型中获取一个张量并在另一个模型中使用它?
- java - Bytearray 从 Java 中的 Mat 转换为 Python 中的 Socket 中的 Image
- c# - 在 C# 中将 hh:mm:ss:fff 转换为 ss.fff
- algorithm - 以更算法的方式进行最大值符号变量替换
- java - Octave的“javaMethod”的困难
- microsoft-cognitive - 为什么在尝试创建 QnA Maker 服务时禁用所有定价层?