大熊猫数据框中每列的Seaborn图?

时间:2017-07-05 17:50:23

标签: python-3.x pandas foreach seaborn

我有一个看起来像这样的小数据框:

csv = [{"Oranges" : 12, "Apples" : 4, "Kiwis" : "Yes"}, {"Oranges" : 1, "Apples" : 8, "Kiwis" : "No"}, {"Oranges" : 1, "Apples" : 14, "Kiwis" : "Yes"}, {"Oranges" : 11, "Apples" : 3, "Kiwis" : "No"}, ]
df = pd.DataFrame(csv)

只有它有更多的cols。我想在每列上绘制一个seaborn小提琴情节。如果我手动创建每列的绘图,它看起来会像这样:

sns.violinplot(y="Oranges", x="Kiwis", data=df, split=True, inner="quart")
sns.violinplot(y="Apples", x="Kiwis", data=df, split=True, inner="quart")

然而,考虑到大约100个cols,我想逐个col地循环遍历数据帧。

我尝试构建一个如下的小函数:

def violin(col):
    sns.violinplot(y=col, x="Kiwis", data=df, split=True, inner="quart")

我的想法是使用apply()将它用于每一列......但它迄今为止的工作......任何想法?

2 个答案:

答案 0 :(得分:1)

您可以将difference用于列Kiwis,然后使用apply按子集[]选择列:

import matplotlib.pyplot as plt

def violin(col):
    sns.violinplot(y=col, x="Kiwis", data=df, split=True, inner="quart")
    plt.figure()


cols = df.columns.difference(['Kiwis'])
df[cols].apply(violin)

答案 1 :(得分:1)

我认为您只需要稍微重新格式化数据帧,然后就可以在一次调用中完成整个绘图:

df = pd.melt(df, "Kiwis", var_name="Fruit", value_name="Value")

使事情看起来像

  Kiwis    Fruit  Value
0   Yes   Apples      4
1    No   Apples      8
2   Yes   Apples     14
3    No   Apples      3
4   Yes  Oranges     12
5    No  Oranges      1
6   Yes  Oranges      1
7    No  Oranges     11

使用

进行绘图很简单
sns.violinplot(x="Fruit", y="Value", hue="Kiwis", data=df,
           split=True, inner="quart")

enter image description here