Python datetime列的简化分组聚合
我有一个带有日期时间、整数和字符串列的数据帧Python datetime列的简化分组聚合,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个带有日期时间、整数和字符串列的数据帧 from io import StringIO import pandas as pd data1 = """Year N X 2008-01-01 2 A 2008-01-01 3 B 2008-01-01 6 C 2008-01-01 2 D 2010-0
from io import StringIO
import pandas as pd
data1 = """Year N X
2008-01-01 2 A
2008-01-01 3 B
2008-01-01 6 C
2008-01-01 2 D
2010-01-01 7 A
2010-01-01 1 B
2010-01-01 8 C
2012-01-01 9 A
2012-01-01 4 B
2016-01-01 1 A"""
df = pd.read_csv(StringIO(data1), delim_whitespace=True, parse_dates=["Year"])
我可以将N列的计数、最小值和最大值聚合为:
df1 = df.groupby("X")["N"].agg(Count="count", Min="min", Max="max").reset_index()
print(df1)
X Count Min Max
0 A 4 1 9
1 B 3 1 4
2 C 2 6 8
3 D 1 2 2
是否有一种方法可以实现仅显示年份的列Year的相同功能?
我可以分几个步骤来完成这项工作:
g = df.groupby("X")["Year"]
df2 = g.agg(Count= "count").reset_index()
df2["Start_date"] = g.min().dt.year.values
df2["End_date"] = g.max().dt.year.values
print(df2)
X Count Start_date End_date
0 A 4 2008 2016
1 B 3 2008 2012
2 C 2 2008 2010
3 D 1 2008 2008
但Nsuch as的版本与上述版本类似
显然不起作用。除了如上所述首先提取最小/最大日期,然后将日期时间列转换为年份列的明显方法外,还有没有更简单的方法来聚合pandas groupby中的第一年和最后一年
日期序列上的lambda函数
X
N
开始日期
结束日期
A.
4.
2008
2016
B
3.
2008
2012
C
2.
2008
2010
D
1.
2008
2008
日期序列上的lambda函数
X
N
开始日期
结束日期
A.
4.
2008
2016
B
3.
2008
2012
C
2.
2008
2010
D
1.
2008
2008
您是否尝试过将GroupBy.agg与命名聚合一起使用
df.assign(Year=pd.to_datetime(df['Year']).dt.year).groupby('X').agg(
N=('N', 'count'), Start_date=('Year', 'first'), End_date=('Year', 'last'),)
N Start_date End_date
X
A 4 2008 2016
B 3 2008 2012
C 2 2008 2010
D 1 2008 2008
如果日期不是升序,请分别使用“min”和“max”而不是“first”和“last”
这样可以避免在grouper中使用lambda表达式,因此这是非常有效的。有关命名聚合的更多信息,请参阅我的帖子。您是否尝试将GroupBy.agg与命名聚合一起使用
df.assign(Year=pd.to_datetime(df['Year']).dt.year).groupby('X').agg(
N=('N', 'count'), Start_date=('Year', 'first'), End_date=('Year', 'last'),)
N Start_date End_date
X
A 4 2008 2016
B 3 2008 2012
C 2 2008 2010
D 1 2008 2008
如果日期不是升序,请分别使用“min”和“max”而不是“first”和“last”
这样可以避免在grouper中使用lambda表达式,因此这是非常有效的。更多关于命名聚合的信息可以在我的帖子中找到。Nice。以前从未遇到过命名聚合。很好。以前从未遇到过命名聚合。我认为您有权单独关闭我的问题,将其作为命名聚合问题的副本。似乎这就是问题的症结所在。我个人认为,有不止一种方式来问同样的问题是好的,尤其是如果你已经做出了诚实的努力,并且在最后一英里寻求帮助的话。所以我对这两种方式都没有强烈的偏好。但既然你似乎不介意,既然链接的dupe已经有了我的答案,我想我会继续为你关闭它:我想你有能力单独关闭我的问题,作为命名聚合问题的副本。似乎这就是问题的症结所在。我个人认为,有不止一种方式来问同样的问题是好的,尤其是如果你已经做出了诚实的努力,并且在最后一英里寻求帮助的话。所以我对这两种方式都没有强烈的偏好。但是既然你似乎不介意,既然链接的复制品有我的答案,我想我会继续为你关闭它:p
df.assign(Year=pd.to_datetime(df['Year']).dt.year).groupby('X').agg(
N=('N', 'count'), Start_date=('Year', 'first'), End_date=('Year', 'last'),)
N Start_date End_date
X
A 4 2008 2016
B 3 2008 2012
C 2 2008 2010
D 1 2008 2008