Plot axvline using a dataframe column error: ValueError: The truth value of a DataFrame is ambiguous.

Plot axvline using a dataframe column error: ValueError: The truth value of a DataFrame is ambiguous.

我正在尝试根据数据框的一列在散点图中添加一条水平线 - 我收到以下错误:ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。


x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})

for country in datLong.ctr1.unique():
    temp_df = plt.figure(country)
    temp_df = datLong[datLong.ctr1 == country]
    ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label = 'xx', linewidth =3, alpha = 0.7, figsize=(7,4))    
   
    plt.title(country)
    plt.axvline(x=x_line) ### this is the line that is causing this error
 
    plt.show()
print (ax1)

问题似乎与数据框有关。但我能弄清楚它是什么?谁能帮帮我

x_line 包含所有国家/地区的值。使用 x_line.loc[country] 您将获得该国家/地区的值。因为它 returns 一个数组(只有一个元素),并且 axvline 只接受单个值,所以你可以 select 它的第一个元素 (x_line.loc[country][0]).

请注意,plt.figure 创建了一个图形,没有 ax= 参数的 pandas plot 也创建了一个新图形。所以,要么你应该省略 plt.figure(),要么明确创建一个 ax 来绘制。

from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

datLong = pd.DataFrame({'ctr1': np.repeat(['country 1', 'country 2'], 20),
                        'x': np.tile(np.arange(20), 2),
                        'maxx': np.random.randn(40) + 10,
                        'Price': np.random.randn(40) * 10 + 200})

x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})

for country in datLong.ctr1.unique():
    temp_df = datLong[datLong.ctr1 == country]
    ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
                       figsize=(7, 4))
    ax1.figure.canvas.set_window_title(country)
    ax1.set_title(country)
    ax1.axvline(x=x_line.loc[country][0])
    plt.show()

由于 groupby 已经为每个国家/地区创建了数据框,您可以使用 groupby 重写代码(不需要 x_line):

for country, country_df in datLong.groupby('ctr1'):
    ax1 = country_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
                       figsize=(7, 4))
    ax1.figure.canvas.set_window_title(country)
    ax1.set_title(country)
    ax1.axvline(x=country_df['maxx'].mean())
    plt.show()