无法使用seaborn barplot绘制数据框。

14

我已经能够使用pandas的groupby创建一个新的DataFrame,但是当我创建一个barplot时出现了错误。

invYr = invoices.groupby(['FinYear']).sum()[['Amount']]

这个命令创建了一个新的DataFrame,看起来对我来说是正确的。

New DataFrame invYr

运行中:

sns.barplot(x='FinYear', y='Amount', data=invYr)

我收到了以下错误信息:

ValueError: 无法解释输入 'FinYear'

看起来问题与索引有关,即 FinYear,但不幸的是,即使使用 reindex,我也无法解决这个问题。


2
尝试使用 data=invYr.reset_index() 将索引重置为列。 - BrenBarn
DataFrame现在没有索引,看起来很好,就像刚导入的CSV文件一样,但不幸的是,相同的错误信息仍然存在。 - sams
2
我的猜测是您没有重新分配invYr.reset_index()的输出。这不是一个原地操作,所以它可能会打印到REPL并看起来像它“工作了”,但这不是您传递给barplot的内容。 - mwaskom
1个回答

25
import pandas as pd
import seaborn as sns

invoices = pd.DataFrame({'FinYear': [2015, 2015, 2014], 'Amount': [10, 10, 15]})
invYr = invoices.groupby(['FinYear']).sum()[['Amount']]

>>> invYr
         Amount
FinYear        
2014         15
2015         20
您出现错误的原因是,在通过对invoices进行分组创建invYr时,FinYear列变为索引而不再是普通的列。有几种解决方法:
1)一种解决方法是直接指定数据源。您需要为图表指定正确的数据源。如果不指定data参数,Seaborn就不知道哪个dataframe/series具有'FinYear'或'Amount'这些列名,因为它们只是文本值。您必须指定,例如,y=invYr.Amount以同时指定要绘制图表的dataframe/series和列名。这里的诀窍在于直接访问dataframe的索引。
sns.barplot(x=invYr.index, y=invYr.Amount)

2) 另外,您可以指定数据源,然后直接引用其列。请注意,分组的数据帧已重置其索引,因此该列再次可用。

sns.barplot(x='FinYear', y='Amount', data=invYr.reset_index())

第三种解决方案是在执行groupby时指定as_index=False,使该列在分组后的数据框中可用。

invYr = invoices.groupby('FinYear', as_index=False).Amount.sum()
sns.barplot(x='FinYear', y='Amount', data=invYr)

以上所有解决方案都会生成下面的相同图形。

在此输入图片描述


谢谢Alexander,这个完美地解决了问题。但我仍然不确定为什么我必须这样做,为什么不能通过列名调用索引?我也想知道为什么@BrenBarn的解决方案没有解决它?无论如何,感谢您的帮助。 - sams
当您执行groupby操作时,默认行为是在分组列上索引结果。为了避免这种情况,您可以使用invYr = invoices.groupby(['FinYear'], as_index=False).sum()[['Amount']]。然后您可以调用sns.barplot(x=invYr.FinYear, y=invYr.Amount) - Alexander
谢谢解释。现在唯一的问题是为什么我不能只输入 ...x='FinYear', data=invYr...,而必须通过输入 x=invYr.FinYear 来限定它呢? - sams
'FinYear'只是一个文本标签。如果您有另一个带有该标签的数据框,那么可能会发生冲突,因为两者都可以有效(更不用说Seaborn不知道所有数据框/系列类型的变量)。作为程序员,您需要限定所引用的数据。 - Alexander
您需要为图表指定正确的数据源。Seaborn不知道哪个数据框/系列具有“FinYear”或“Amount”列,因为这些只是文本值。原始问题中的代码明确指定了data = invYr;不需要将Series对象传递给xy - mwaskom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接