我有一个看起来像这样的小数据框:
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()
将它用于每一列......但它迄今为止的工作......任何想法?
答案 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")