Python Pandas 系列 if else 箱线图

Posted

技术标签:

【中文标题】Python Pandas 系列 if else 箱线图【英文标题】:Python Pandas Series if else box plot 【发布时间】:2018-08-01 04:57:11 【问题描述】:

我有很多字典格式的数据,我正在尝试使用 pandas 打印基于 IF ELSE 语句的字符串。对于我的示例,我将在 dict 中编造一些数据并隐蔽到 Pandas:

df = pd.DataFrame(dict(a=[1.5,2.8,9.3],b=[7.2,3.3,4.9],c=[13.1,4.9,15.9],d=[1.1,1.9,2.9]))

df

这会返回:

    a   b   c   d
0   1.5 7.2 13.1 1.1
1   2.8 3.3 4.9 1.9
2   9.3 4.9 15.9 2.9

我的 IF ELSE 声明:

for col in df.columns:
    if (df[col] < 4).any():
        print('Zone %s does not make setpoint' % col)
    else:
        print('Zone %s is Normal' % col)

返回:

Zone a does not make setpoint
Zone b does not make setpoint
Zone c is Normal
Zone d does not make setpoint

但是现在我想添加一个额外的内容来创建一个箱形图,其中我没有设置设定点,并且还平均了它正在设置设定点的数据框。我知道这是pandas系列,但是pandas.Series.plot.box()可以用吗?

这是我在 df.apply(lamba x:) 的函数中使用的 IF ELSE 语句,我一直试图让箱形图在熊猫系列中工作......非常感谢任何建议!

import matplotlib.pyplot as plt

def _print(x):
    if (x < 4).any():
        print('Zone %s does not make setpoint' % x.name)
        df.boxplot()
        plt.show()
    else:
        print('Zone %s is Normal' % x.name)
        print('The average is %s' % x.mean())

我在拨打df.apply(lambda x: _print(x))时遇到错误

module 'matplotlib' has no attribute 'show'

【问题讨论】:

我无法重现您的错误(according to this 在您添加 import matplotlib.pyplot as plt 时是否已修复)?如果是,你能更新你的问题吗? 【参考方案1】:

我真的不知道这是否是你要找的,但是......你在问:

我想添加一个额外的来创建一个箱形图

您正在尝试使用...df.Series.plot.box(),它会输出错误AttributeError: 'DataFrame' object has no attribute 'Series'

尝试改用df.boxplot(),然后在每次plt.show() 调用时显示...

【讨论】:

我更新了帖子,其中箱形图仅根据条件在 if else 语句的一部分上运行,但我仍然收到错误。你有什么想法让它发挥作用吗?谢谢【参考方案2】:

当然,您可以像df['a'].plot.box() 一样调用pandas.Series.plot.box() 来获取您的列a 的箱线图。

为了符合您的问题,我会这样做:

def _print(x):
    if (x < 4).any():
        print('Zone %s does not make setpoint' % x.name)
        df[x.name].plot.box() #call x.name to retrieve the column name
        plt.show()
        print(df[x.name].describe())
    else:
        print('Zone %s is Normal' % x.name)
        print('The average is %s' % x.mean())
    print('---')

df.apply(lambda x: _print(x))

下图为zone Bzone C 的输出摘录。

请注意,您可以添加.describe() 以获取箱线图和其他统计信息描述(请参阅documentation)。

不过,根据here 提出的解决方案,我会以不同的方式解决问题。


另一种解决方案

您可以过滤您的数据框以拆分为 make setpoint 或不:

s = df.apply(lambda x: not (x < 4).any())

然后在没有设定点的那个上画出方框。 如果变化不是太大,并且没有那么多区域,则将所有内容绘制在一个图中:

df[s[~s].index].boxplot()
plt.show()

或将它们分开:

for col in s[~s].index:
    df[col].plot.box()
    plt.show()

在这两种情况下都可以在dataframe 中获取统计信息:

statdf = df[s[~s].index].describe()
print(statdf)

              a         b         d
count  3.000000  3.000000  3.000000
mean   4.533333  5.133333  1.966667
std    4.178915  1.960442  0.901850
min    1.500000  3.300000  1.100000
25%    2.150000  4.100000  1.500000
50%    2.800000  4.900000  1.900000
75%    6.050000  6.050000  2.400000
max    9.300000  7.200000  2.900000

通过这种方式,您可以使用statdf.loc['mean'] 获取统计信息(例如“mean”)。

如果您想打印设置点的平均值:

print(df[s[s].index].mean())

c    11.3
Name: mean, dtype: float64

【讨论】:

以上是关于Python Pandas 系列 if else 箱线图的主要内容,如果未能解决你的问题,请参考以下文章

python系列教程146——if/else简写

错误:系列的真值不明确 - Python pandas

pandas(Dataframe)里使用lambda匿名函数if..else表达式

带有 if else 的 Pandas 列表达式

Pandas 使用 If/Then/Else 语句在循环中抛出错误

Python全栈自动化系列之Python编程基础(if条件判断)