Python:如何获得显示数据帧不同值的条形图概览?

2024-09-29 01:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用此lambda函数从数据帧中获得所有不同值的概览:

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

返回所需的结果,如下所示:

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

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

我的第一次尝试只是将对象放入dataframe的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,例如提供:

Taken from a course about Alteryx

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

谢谢


Tags: 数据对象方法lambdaindfforvalue
2条回答

通过^{}进行单独绘图:

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()
^{tb1}$

通过^{}+^{}的单个堆叠图:

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()

stacked plot

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

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()

Numerical counts

Aphabetical counts

相关问题 更多 >