고유하지 않은 열의 날짜별로 Pandas DataFrame 항목을 그룹화하는 방법


82

Pandas DataFrame에는 "date"고유하지 않은 datetime값 을 포함하는 이름 이 지정된 열 이 있습니다 . 다음을 사용하여이 프레임의 라인을 그룹화 할 수 있습니다.

data.groupby(data['date'])

그러나 이렇게하면 데이터가 datetime값으로 분할 됩니다. "날짜"열에 저장된 연도별로 이러한 데이터를 그룹화하고 싶습니다. 이 페이지 는 타임 스탬프가 색인으로 사용되는 경우 연도별로 그룹화하는 방법을 보여줍니다. 이는 제 경우에는 사실이 아닙니다.

이 그룹을 어떻게 달성합니까?


2017 년 이후에 여기에 오는 사람들을 위해 특정 시간 동안 그룹화하는 몇 가지 새로운 방법이 있습니다. 아래 답변을 참조하십시오
Ted Petrou 2011

답변:


91

pandas 0.16.2를 사용하고 있습니다. 이것은 내 대규모 데이터 세트에서 더 나은 성능을 제공합니다.

data.groupby(data.date.dt.year)

dt옵션을 사용하고 weekofyear, dayofweek등으로 노는 것이 훨씬 쉬워집니다.


Concur, 이것은 시리즈의 날짜 속성에 액세스하는 팬더 방식 인 것 같습니다.
dancow

74

ecatmur의 솔루션이 잘 작동합니다. 그러나 이는 대규모 데이터 세트에서 더 나은 성능을 제공합니다.

data.groupby(data['date'].map(lambda x: x.year))

9
신청하는 대신지도를 사용하는 이유는 무엇입니까?
Gus

1
Afaik은 map일반적으로 apply.
Coolio2654

25

이는 샘플 데이터 세트로 설명하기 더 쉬울 수 있습니다.

샘플 데이터 생성

Timestamps의 단일 열과 date집계를 수행하려는 다른 열인 a.

df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']),
                   'a':[9,5,1,2,3]}, columns=['date', 'a'])

df

        date  a
0 2012-01-01  9
1 2012-06-01  5
2 2015-01-01  1
3 2015-02-01  2
4 2015-03-01  3

연도별로 그룹화하는 방법에는 여러 가지가 있습니다.

  • year속성 과 함께 dt 접근 자 사용
  • 넣어 date인덱스에 액세스 년에 익명 함수를 사용
  • 사용 resample방법
  • 판다 시대로 전환

.dt에 접근 year부동산

pandas Timestamps의 열 (색인이 아님)이있는 경우 접근자를 사용하여 더 많은 추가 속성 및 메서드에 액세스 할 수 있습니다 dt. 예를 들면 :

df['date'].dt.year

0    2012
1    2012
2    2015
3    2015
4    2015
Name: date, dtype: int64

이를 사용하여 그룹을 형성하고 특정 열에 대한 일부 집계를 계산할 수 있습니다.

df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])

      sum  mean  max
date                
2012   14     7    9
2015    6     2    3

색인에 날짜를 넣고 익명 기능을 사용하여 연도에 액세스

날짜 열을 인덱스로 설정하면 dt접근자가 일반 열을 제공 하는 것과 동일한 속성 및 메서드를 가진 DateTimeIndex가됩니다.

df1 = df.set_index('date')
df1.index.year

Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')

흥미롭게도 groupby 메서드를 사용할 때 함수를 전달할 수 있습니다. 이 함수는 암시 적으로 DataFrame의 인덱스를 전달합니다. 따라서 위에서 다음과 같은 결과를 얻을 수 있습니다.

df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])

      sum  mean  max
2012   14     7    9
2015    6     2    3

resample방법 사용

날짜 열이 색인에없는 경우 on매개 변수로 열을 지정해야합니다 . 오프셋 별칭 도 문자열로 지정해야 합니다.

df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max'])

             sum  mean  max
date                       
2012-01-01  14.0   7.0  9.0
2013-01-01   NaN   NaN  NaN
2014-01-01   NaN   NaN  NaN
2015-01-01   6.0   2.0  3.0

판다 시대로 전환

날짜 열을 pandas Period 객체로 변환 할 수도 있습니다. 기간의 길이를 결정하려면 오프셋 별칭을 문자열로 전달해야합니다.

df['date'].dt.to_period('A')

0   2012
1   2012
2   2015
3   2015
4   2015
Name: date, dtype: object

그런 다음 이것을 그룹으로 사용할 수 있습니다.

df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])


      sum  mean  max
2012   14     7    9
2015    6     2    3

을 사용하는 마지막 방법에서 to_period('A')그 ( 'A')는 무엇입니까?
shiv_90

2
Shiv_90 @는 'A'시계열이 오프셋 별칭 : pandas.pydata.org/pandas-docs/stable/...
ptim

별도의 '날짜'열도 저장해야하는 경우 어떤 방법을 권장합니까? 예를 들어 간단한 .dt.year방법을 실행하고 새 데이터 프레임에 저장하면 날짜가 인덱스로 저장되고 '날짜'열이 실제로 존재하지 않고 3 개만 있기 때문에 데이터를 플로팅해야한다고하면 문제가됩니다. 제공.agg()
shiv_90

13

이것은 작동합니다.

data.groupby(lambda x: data['date'][x].year)

0

이것은 또한 작동합니다

data.groupby(data['date'].dt.year)


작동해야하지만 실행될 때 메모리에있는 객체의 위치를 ​​출력하지만 실제 출력은 없습니다. <pandas.core.groupby.DataFrameGroupBy object at 0x10d7f6438>내가 처형 될 때 얻는 것입니다.
shiv_90
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.