Jupyter中使用if else创建seaborn图表出现错误

4
我尝试使用seaborn在python中为日期列创建图表。我遇到下面的错误。你有任何想法如何修复它吗?
----> 4 if df['MS_Date']=="s.xii" or df['MS_Date']=="s.xii(1)" or df['MS_Date']=="s.xii(2)" or df['MS_Date']=="s.xii(in)" or df['MS_Date']=="s.xii(ex)" or df['MS_Date']=="s.xii(med)": 5 df['MS_Date']== "12th century" 6 if df['MS_Date']=="s.xii/xiii" or df['MS_Date']=="s.xii/xiii":
在 pandas 的 generic.py 文件中
非零(self)
通过模糊匹配其他轴的级别和标签,我们的意思是它同时匹配输入轴的级别和另一轴的标签。
参数
ValueError:一个序列的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
代码:
if df['MS_Date']=="s.xii" or df['MS_Date']=="s.xii(1)" or df['MS_Date']=="s.xii(2)" or df['MS_Date']=="s.xii(in)" or df['MS_Date']=="s.xii(ex)" or df['MS_Date']=="s.xii(med)": 
        df['MS_Date']== "12th century"
if df['MS_Date']=="s.xii/xiii" or df['MS_Date']=="s.xii/xiii":
    df['MS_Date']=="12 & 13 century"
if df['MS_Date']=="s.xiii" or df['MS_Date']=="s.xiii(1)" or df['MS_Date']=="s.xiii(2)" or df['MS_Date']=="s.xiii(in)" or df['MS_Date']=="s.xiii(ex)" or df['MS_Date']=="s.xiii(med)":
    df['MS_Date']=="13 century"
if df['MS_Date']=="s.xiii/s.xiv" or df['MS_Date']=="s.xiii/xiv":
    df['MS_Date']=="13 & 14 century"
if df['MS_Date']=="s.xiii/s.xv":
    df['MS_Date']=="13 & 15 century"
if  df['MS_Date']=="s.xiv" or df['MS_Date']=="s.xiv(1)" or df['MS_Date']=="s.xiv(2)" or df['MS_Date']=="s.xiv(in)" or df['MS_Date']=="s.xiv(ex)"  or df['MS_Date']=="s.xiv(med)": 
    df['MS_Date']=="14th century"
if  df['MS_Date']=="s.xiv/xv":
    df['MS_Date']== "14 & 15 century"
if df['MS_Date']=="s.xv" or df['MS_Date']=="s.xv(1)" or df['MS_Date']=="s.xv(2)" or df['MS_Date']=="s.xv(in)" or df['MS_Date']=="s.xv(ex)" or df['MS_Date']=="s.xv(med)" :
    df['MS_Date']=="15th century"
if  df['MS_Date']=="s.xv/xvi":
    df['MS_Date']== "15 & 16 century"
if df['MS_Date']=="xvi" or df['MS_Date']=="s.xvi(in)":
    df['MS_Date']== "16 century"
else:
    df['MS_Date']=="unknown"



import seaborn as sns
sns.set(style="whitegrid")
fig, ax = plt.subplots()
fig.set_size_inches(25, 12)
sns.countplot(x='MS_Date', data=df, order=df['MS_Date'].value_counts().index, palette="Greens_d")
sns.set(style="white")
dfnew=nbl.describe(include=['object'])
num=dfnew.loc['count','MS_Date']
# df.iloc[0]['MS_Date']
ax.set_title('Distrubution of all manuscripts '+str(num)+' manuscripts')

1
最好使用np.select方法。这样更容易跟踪条件和要分配的值。 - Pygirl
1个回答

2
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这个错误意味着您正在获取一系列布尔值,而不是单个布尔值。对于使用if和else,您需要一个单一的True/False值,但是在这里使用df ['MS_Date'] == "s.xii"将会得到一个系列,该系列基于它们满足的标准给出所有位置的True/False。
示例数据框:
    Player      Position    color
0   Pele        Forward     black
1   Platini     Midfielder  white
2   Beckenbauer Defender    red

如果我想根据某些条件更改颜色列的值,那么我不会使用if和else,而是像这样编写:

df.loc[(df['Player']=='Pele') | (df['Position']=='Forward'), 'color'] = 'white'

或者

您可以使用numpy.where这样编写它:

np.where(<condition>, <value1 if true>, <value2 if false>) 

df['color'] = np.where((df['Player']=='Pele') | (df['Position']=='Forward'), 'black', df.color)

为了使其简洁明了,请使用np.select,请参阅此处的用法:https://dev59.com/A10a5IYBdhLWcg3wLWAG#60244752 而且,您可以使用eq代替使用== 我将使用loc来获取条件为真的位置。 在该位置上,我将选择要更改的列。df.loc[<conditions>, <column to assign>] = <value> 像这样使用:
df.loc[(df['MS_Date']=="s.xii") | (df['MS_Date']=="s.xii(1)") | (df['MS_Date']=="s.xii(2)") | (df['MS_Date']=="s.xii(in)") | (df['MS_Date']=="s.xii(ex)") | (df['MS_Date']=="s.xii(med)"), 'MS_Date']= "12th century"
df.loc[(df['MS_Date']=="s.xii/xiii") | (df['MS_Date']=="s.xii/xiii"), 'MS_Date']="12 & 13 century"

是的!它真的很有帮助!我正在尝试弄清楚如何进行排序。 - d12
@ Pygirl 你知道如何排序吗?比如12th、13th、14th等等?sns.countplot(x='MS_Date', data=df, order=df['MS_Date'].value_counts().index, palette="Greens_d") - d12
你需要创建一个自定义的排序函数。 - Pygirl

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