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

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

data.groupby(data['date'])

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

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



답변

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

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

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


답변

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

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


답변

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

샘플 데이터 생성

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


답변

이것은 작동합니다.

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


답변

이것은 또한 작동합니다

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


답변