pandas 数据框中每列的 Seaborn 图?

Seaborn plot per column in a pandas dataframe?

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

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 列,我想逐列循环遍历数据帧。

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

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

我的想法是使用 apply() 将它用于每一列...但到目前为止它还没有用。有什么想法吗?

您可以对 Kiwis 列使用 difference,然后使用 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)

我认为你只需要稍微重新格式化你的数据框,然后你就可以在一次调用中完成整个情节:

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")