簡體   English   中英

熊貓:帶有multiIndex數據幀的條形圖

[英]Pandas: bar plot with multiIndex dataframe

我有一個帶有TIMESTAMP列(不是索引)的pandas DataFrame,時間戳格式如下:

2015-03-31 22:56:45.510

我還有名為CLASSAXLES列。 我想為AXLES每個唯一值分別計算每個月的記錄數( AXLES可以取3-12之間的整數值)。

我想出了resamplegroupby的組合:

resamp = dfWIM.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS

這似乎給了我一個multiIndex數據幀對象,如下所示。

In [72]: resamp

Out [72]:

AXLES  TIMESTAMP 
3      2014-07-31      5517
       2014-08-31     31553
       2014-09-30     42816
       2014-10-31     49308
       2014-11-30     44168
       2014-12-31     45518
       2015-01-31     54782
       2015-02-28     52166
       2015-03-31     47929
4      2014-07-31      3147
       2014-08-31     24810
       2014-09-30     39075
       2014-10-31     46857
       2014-11-30     42651
       2014-12-31     48282
       2015-01-31     42708
       2015-02-28     43904
       2015-03-31     50033

從這里,如何訪問此multiIndex對象的不同組件以創建以下條件的條形圖?

  • 當AXLES = 3時顯示數據
  • 以月 - 年格式顯示x刻度(無日,小時,分鍾等)

謝謝!

編輯 :以下代碼給我的情節,但我無法將xtick格式更改為MM-YY。

resamp[3].plot(kind='bar')

在此輸入圖像描述

下面的編輯2是一個代碼片段,它生成一個類似於我的數據的小樣本:

dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]}
dfTest = pd.DataFrame(dftest)
dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP))
resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS
resamp[3].plot(kind='bar')

編輯3:以下是解決方案:

A.繪制整個重采樣數據幀(基於@Ako的建議):

df = resamp.unstack(0)
df.index = [ts.strftime('%b 20%y') for ts in df.index]
df.plot(kind='bar', rot=0)

在此輸入圖像描述

B.從重新采樣的數據幀中繪制單個索引(基於@Alexander的建議):

df = resamp[3]
df.index = [ts.strftime('%b 20%y') for ts in df.index]
df.plot(kind='bar', rot=0)

在此輸入圖像描述

您可以生成和使用明確設置標簽ax.xaxis.set_major_formatterticker.FixedFormatter 這將允許您使用時間戳值保留DataFrame的MultiIndex,同時以所需的%m-%Y格式顯示時間戳:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as ticker

dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]}
dfTest = pd.DataFrame(dftest)
dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP))
resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS

ax = resamp[3].plot(kind='bar')
ticklabels = [timestamp.strftime('%m-%Y') for axle, timestamp in resamp.index]
ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: ticklabels[int(x)]))
plt.gcf().autofmt_xdate()

plt.show()

產量 在此輸入圖像描述

以下應該可行,但沒有一些數據很難測試。

首先重置索引以訪問TIMESTAMP列。 然后使用strftime將其格式化為所需的文本表示(例如mm-yy)。 最后,將索引重置為AXLESTIMESTAMP

df = resamp.reset_index()
df['TIMESTAMP'] = [ts.strftime('%m-%y') for ts in df.TIMESTAMP]
df.set_index(['AXLES', 'TIMESTAMP'], inplace=True)
>>> df.xs(3, level=0).plot(kind='bar')

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM