2014-01-24 3 views
4

두 개의 열이있는 DataFrame이 있습니다. 그들 중 하나는 타임 스탬프와 다른 행동을 포함하고 있습니다. 다음과 같은 것 :Pandas DataFrame의 플롯 수

2000-12-29 00:10:00  action1 
2000-12-29 00:20:00  action2 
2000-12-29 00:30:00  action2 
2000-12-29 00:40:00  action1 
2000-12-29 00:50:00  action1 
... 
2000-12-31 00:10:00  action1 
2000-12-31 00:20:00  action2 
2000-12-31 00:30:00  action2 

특정 날짜에 특정 유형의 작업이 몇 번 수행되었는지 알고 싶습니다. 즉, 매일 나는 actionX의 발생 횟수를 세고이 데이터를 X 축의 날짜와 Y 축의 actionX 발생 횟수로 각 날짜별로 플롯해야한다.

당연히 나는 데이터 세트를 반복하여 순진하게 매일 작업을 계산할 수 있습니다. 하지만 팬더/매트로 립 브에서 할 수있는 "올바른 방법"은 무엇입니까?

답변

4

당신은

df['mydate'] = pd.to_datetime(df['mydate']) 
df = df.set_index('mydate') 
df['day'] = df.index.date 
counts = df.groupby(['day', 'col_name']).agg(len) 

을 할 수 있지만, 아마도 더 간단한 방법이

   mydate col_name 
0 2000-12-29 00:10:00 action1 
1 2000-12-29 00:20:00 action2 
2 2000-12-29 00:30:00 action2 
3 2000-12-29 00:40:00 action1 
4 2000-12-29 00:50:00 action1 
5 2000-12-31 00:10:00 action1 
6 2000-12-31 00:20:00 action2 
7 2000-12-31 00:30:00 action2 

에서 시작. 어쨌든 위는 효과가 있습니다. 당신이 DataFrame로 카운트를 사용하려면

, 그때

counts = pd.DataFrame(counts, columns=['count']) 
+0

답변 해 주셔서 감사합니다. 나는 당신의 코드에서 마지막 줄을 다음과 같이 바 꾸었습니다 : 하루에 데이터를 그룹화해야하므로'counts = df.groupby ([df.day.to_period ('D'), 'col_name']) .gg (len)' 그리고 색인에서 정확한 시간으로 아닙니다. 그것은 작동하고 나에게 multindexed 시리즈 객체를 주었다. 그러나 나는이 데이터를 'unstack'할 수 없기 때문에이 데이터를 플로팅 할 수 없다. 나는 여기에이 문제에 대한 별도의 질문을 물었다. http://stackoverflow.com/questions/21352520/pandas-unstack-doesnt-work 그리고 버그가있는 것 같다. 'unstack'이 작동하지 않으므로이 데이터를 플롯 할 수있는 또 다른 방법이 있을까요? 감사합니다 – Timofey

13

당신은

df.groupby([df.index.date, 'action']).count() 

를 사용하여 수를 얻을 수 있습니다 다시 변환 것 또는 당신이이 방법을 사용하여 직접 플롯 할 수 있습니다

df.groupby([df.index.date, 'action']).count().plot(kind='bar') 

결과를 count에 저장 한 다음 그 결과를 sepa로 그릴 수도 있습니다. 갑자기. 이것은 인덱스가 이미 datetimeindex 형식 인 것으로 가정합니다. 그렇지 않으면 위의 @mkln 지시를 따르십시오.

+2

결과를 순서대로 얻는 것은 유용하므로 파이프 라인에'order()'를 추가합니다. – kiril

관련 문제