簡體   English   中英

繪制按列分組的pandas數據框

[英]Plot a pandas dataframe grouped by column

我有以下pandas數據幀'df':

---------------------------------------------------
             C1     C2     C3      C4      Type
---------------------------------------------------
    Name 
---------------------------------------------------
     x1       a1     b1      c1      d1     'A'
     x2       a2     b2      c2      d2     'A'
     x3       a3     b3      c3      d3     'B'
     x4       a4     b4      c4      d4     'B'
     x5       a5     b5      c5      d5     'A'
     x6       a6     b6      c6      d6     'B'
     x7       a7     b7      c7      d7     'B'
---------------------------------------------------

此數據框中有6列: Name, C1, C2, C3, C4, and Type 我想使用由“類型”列分組的數據幀生成兩個線圖(單獨的圖 - 在同一圖上不是兩行)。 基本上,我想繪制C1的值相對於按類型分組的名稱。 所以,在一張圖上,我希望在一個圖上有(x1, c1), (x2, c2), (x5, c5) on one plot, and (x3,c3), (x4, c4), (x6,c6), and (x7,c7)在另一方面。

請注意,Name和其他列位於不同的行中。

我發現了一個類似的問題對SO密謀箱線圖在這里 ,所以我試圖修改它的線圖。 我嘗試使用df.plot(column='C1', by='Type')但似乎沒有一個屬性'column' for a plot()

關於如何實現目標的任何想法?

您可以將“Type”列添加到索引中,然后將其取消堆疊,以便根據Type的值將C1的值拆分為兩列,然后繪制它們,例如:

import pandas
df = pandas.DataFrame({'Values': randn(10), 'Categories': list('AABABBABAB')}, index=range(10))
df.set_index('Categories', append=True).unstack().interpolate().plot(subplots=True)

請注意,對於線圖,您需要'interpolate()'。

或者,您可以根據“類型”的值(這些示例中的“類別”)選擇數據並單獨繪制它們,例如:

fig, axes = plt.subplots(ncols=2)
df[df.Categories=='A'].Values.plot(ax=axes[0])
df[df.Categories=='B'].Values.plot(ax=axes[1])

以下答案基於faltarell的第二種方法,但針對任意數量的類別進行了推廣。

建立:

import pandas
import matplotlib.pyplot as plt
from numpy.random import randn
df = pandas.DataFrame({'Values': randn(10), 
                       'Categories': list('AABABBABAB')},
                       index=range(10))

繪制圖:

categories = df['Categories'].unique()

fig, axes = plt.subplots(ncols=len(categories))

for i, category in enumerate(categories):
    df[df['Categories'] == category]['Values'].plot.line(ax=axes[i])
    axes[i].set_title(category)

您可以使用帶標記的線制作類似的單圖圖:

fig, ax= plt.subplots()

for category in df['Categories'].unique():
    df[df['Categories'] == category]['Values'].plot.line(ax=ax, label=category)

plt.legend()

暫無
暫無

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

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