【问题标题】:How to pipe pandas groupby parts to seaborn distplot?如何将 pandas groupby 部分通过管道传送到 seaborn distplot?
【发布时间】:2020-09-27 13:02:26
【问题描述】:

我正在学习在 pandas 中使用 .pipe 方法,想知道我们是否可以使用它来绘制每组 groupby 的 distplot。

MWE


import numpy as np
import pandas as pd
import seaborn as sns

# data
np.random.seed(100)
data = {'year': np.random.choice([2016, 2018, 2020], size=400),
        'item': np.random.choice(['Apple', 'Banana', 'Carrot'], size=400),
        'price': np.random.random(size=400)}

df = pd.DataFrame(data)

# distplots
for year in df['year'].unique():
    x = df['price'][df['year'] == year]
    sns.distplot(x, hist=False, rug=True)

问题

我们可以使用 pandas groupby 而不使用 for 循环来获得相同的情节吗?

我的尝试:

df.groupby('year').pipe(lambda dfx: sns.distplot(dfx['price']))
# TypeError: cannot convert the series to <class 'float'>

# df[['year','price']].groupby('year').pipe(sns.distplot)
# TypeError: float() argument must be a string or a number, not 'DataFrame'

需要的输出

与 for-loop 的输出相同,但使用 pandas 管道。

【问题讨论】:

    标签: python pandas seaborn


    【解决方案1】:

    不完全是pipe,但你可以使用apply

    df.groupby('year')['price'].apply(sns.distplot, hist=False, rug=True);
    

    输出(相同):

    【讨论】:

      【解决方案2】:

      如果您还想要标签,您可以执行以下操作:

      import numpy as np
      import pandas as pd
      import seaborn as sns
      import matplotlib.pyplot as plt
      
      iris = sns.load_dataset('iris')
      
      #iris.groupby('species')['sepal_length'].apply(lambda x:sns.distplot(x,hist=False, rug=False,label = x.name))
      
      iris.groupby('species')['sepal_length']\
          .apply(lambda x: sns.kdeplot(x, label = x.name))
      
      plt.xlabel('sepal_length')
      plt.ylabel('kde')
      plt.show()
      

      【讨论】:

      • 谢谢!立即使用.apply(lambda x: sns.kdeplot(x, label = x.name))
      猜你喜欢
      • 2019-11-15
      • 2020-08-16
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2020-08-20
      相关资源
      最近更新 更多