【问题标题】:Python: How can I get a bar chart overview showing distinct values of a data frame?Python:如何获得显示数据框不同值的条形图概览?
【发布时间】:2021-08-11 15:32:42
【问题描述】:

我使用这个 lambda 函数从数据框中获得了所有不同值的概览:

overview = df.apply(lambda col: col.unique())

这样会返回所需的结果:

ColA            [1,2,3,...]
ColB            [4,5,6,7,8,9...]
ColC            [A,B,C]
...             ...

如何使用子图/多个条形图可视化此结果?

我的第一次尝试只是将对象扔到数据框的 plot 方法中,这显然行不通。所以我尝试从对象中创建一个数据框:

overview = {}
for attr, value in overview.iteritems():
    overview[attr] = value

df = pd.DataFrame(overview)

输出是:

ValueError: arrays must all be same length

所以我正在尝试使用列表:

overview = []
for attr, value in obj_overview.iteritems():
    overview.append({attr: value})

df = pd.DataFrame(overview)

但结果是一个交叉矩阵,它的行数与列数一样多,行 n 引用列 n。这也是错误的。

如何使用显示数据框不同值的多个条形图/子图获得概览?

事实上,我想实现两个可能的目标:

  1. 有多个条形图,每个图表代表原始数据框中的一列。 X 轴显示所有不同/唯一值,Y 轴显示每个这些值的出现次数。这是不错的选择。我知道我目前的方法无法涵盖这一点。它基于类似的插件 Alteryx,例如提供:

  1. 我目前的方法应该可以做到这一点:只有一个(堆叠)条形图显示所有列,其中 x 轴显示每一列,每个相应的条包含所有不同的值。

谢谢!

【问题讨论】:

  • 您希望您的图表是什么样的?您能否模拟一些东西或解释您希望如何显示数据,因为显示数据的方式有很多?每列一个酒吧? x 轴是每个独特的项目,y 是计数?还有什么?
  • @Henry Ecker 有效的问题,谢谢。将添加它。

标签: python pandas dataframe bar-chart distinct-values


【解决方案1】:

通过value_counts 分开绘图:

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({'ColA': [1, 2, 4, 4, 5],
                   'ColB': [4, 4, 6, 6, 6],
                   'ColC': ['A', 'C', 'C', 'E', 'E']})


for col in df:
    df[col].value_counts().sort_index().plot(kind='bar', rot=0, ylabel='count')
    plt.show()
ColA ColB ColC

通过melt + crosstab 的单个堆叠图:

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({'ColA': [1, 2, 4, 4, 5],
                   'ColB': [4, 4, 6, 6, 6],
                   'ColC': ['A', 'C', 'C', 'E', 'E']})

overview = df.melt()
overview = pd.crosstab(overview['variable'], overview['value'])

ax = overview.plot(kind='bar', stacked=True, rot=0, ylabel='count')
ax.legend(bbox_to_anchor=(1.2, 1))
plt.tight_layout()
plt.show()

【讨论】:

    【解决方案2】:

    这将为您提供所有数字列的热图和所有字母列的热图,其中颜色表示出现次数。这是另一种绘制信息的方式。

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    col_dict = {
        'A': [1,2,3],
        'B': [3,4,4,4,5,5,6],
        'C': ['A','B','C'],
        'D': ['C', 'D', 'D']
    }
    
    num_cols = []
    num_idx = []
    letter_cols = []
    letter_idx = []
    
    for col in col_dict:
        if isinstance(col_dict[col][0], int):
            num_cols += col_dict[col]
            num_idx.append(col)
        else:
            letter_cols += col_dict[col]
            letter_idx.append(col)
    
    num_cols = sorted(list(set(num_cols)))
    letter_cols = sorted(list(set(letter_cols)))
    
    num_df = pd.DataFrame(0, index=num_idx, columns=num_cols)
    letter_df = pd.DataFrame(0, index=letter_idx, columns=letter_cols)
    
    for col in col_dict:
        if isinstance(col_dict[col][0], int):
            for item in col_dict[col]:
                num_df.loc[col, item] += 1
        else:
            for item in col_dict[col]:
                letter_df.loc[col, item] += 1
    
    print(num_df)
    print(letter_df)
    
    plt.set_cmap('inferno')
    
    plt.pcolor(num_df)
    plt.yticks(np.arange(0.5, len(num_df.index), 1), num_df.index)
    plt.xticks(np.arange(0.5, len(num_df.columns), 1), num_df.columns)
    plt.colorbar()
    plt.xlabel('Counts')
    plt.ylabel('Columns')
    plt.title('Numerical occurrences')
    
    plt.figure()
    plt.pcolor(letter_df)
    plt.yticks(np.arange(0.5, len(letter_df.index), 1), letter_df.index)
    plt.xticks(np.arange(0.5, len(letter_df.columns), 1), letter_df.columns)
    plt.colorbar()
    plt.xlabel('Counts')
    plt.ylabel('Columns')
    plt.title('Aphabetical occurrences')
    
    plt.show()
    

    【讨论】:

    • 虽然我也很感谢你的努力,但@Henry Ecker 的回答更简洁一些……无论如何,我欠你一杯咖啡。谢谢!
    • 感谢您的反馈。我添加了情节示例,因为我的方法有些不同,只是为了获得灵感。
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2017-05-13
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多