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