【问题标题】:How to visualise attributes from other columns in a histogram in Python如何在 Python 中可视化直方图中其他列的属性
【发布时间】:2021-10-25 15:18:27
【问题描述】:

我有一个包含 3 列的数据框:“C_code”、“F_namn”和“D_namn”,其中包含字符串。我想创建一个直方图,显示“F_namn”(地理区域)的分布,并且在每个 bin 内,可以设置“C_code”的分布,即 a、b 或 c,堆叠在每个 bin 的顶部其他。

import pandas as pd
import matplotlib.pyplot as plt
C_code = ['a', 'a', 'b', 'a', 'c', 'a', 'b', 'a']
F_namn = ['sthlm', 'norr', 'syd', 'norr', 'norr', 'sthlm', 'syd', 'norr']
D_namn = ['ff', 'rr', 'ff', 'gg', 'ff', 'rr', 'rr', 'ff']
df_test = pd.DataFrame({'C_code': C_code, 'F_namn': F_namn, 'D_namn': D_namn})
df_counts_test = df_test.apply(pd.value_counts)

df_counts_test['F_namn'].dropna().plot.bar(stacked=True)
plt.show()

这是 F namn 的直方图,我希望每个 bin 有 3 个“区域”,其中包含来自同一数据帧的“C_code”列的分布。

【问题讨论】:

  • 你尝试了什么?你的代码在哪里?您可以先计算所有值,然后将其绘制为框
  • 顺便说一句:您可以添加我们可以用来创建答案的示例数据(作为文本)。您还可以显示示例数据的预期结果 - 这可以是图像。并提出问题,而不是评论。
  • 您好,感谢您的评论,意识到这个问题可能有点含糊。现在清楚了吗?
  • 它不是histogram,而是正常的条形图。如果您检查documentation for bar-plot,那么您会看到bar(stacked=True) 的示例。
  • 如果您将一些示例数据直接放在代码中(而不是从文件中加载)会更好 - 这样我们就可以简单地复制并运行它。

标签: python dataframe histogram


【解决方案1】:

您的主要问题是计算错误。
如果您使用print(df_counts_test),那么您应该会看到结果对于您想要的情节毫无用处。

使用pd.value_counts 计算总计数。你的情节只显示你有多少次名字sthlm,norr,syd在名单上,但它不计算你得到多少次a,b,c对于每个@987654331 @、norr、syd。

您应该使用groupby('F_namn'),并且在每个组中您应该在'C_code' 列上使用value_counts 来分别计算每个组。


首先我为结果创建DataFrame - 我将为每个组添加包含结果的列。
它在开始时需要行/索引。如果我不定义index 则不会添加结果。

result = pd.DataFrame(index=['a', 'b', 'c'])

接下来我按F_name 分组并分别计算每个组的value_counts

for name, data in df_test.groupby('F_namn'):
    #print(name)
    #print(data['C_code'].value_counts())
    result[name] = data['C_code'].value_counts()

这给了我:

   norr  sthlm  syd
a   3.0    2.0  NaN
b   NaN    NaN  2.0
c   1.0    NaN  NaN

我可以用零替换NaN,但即使使用NaN,它也应该正确绘制

result = result.fillna(0)

它还需要transpose它 - 这意味着将列转换为行。

result = result.T  # transpose

这给了我:

         a    b    c
norr   3.0  0.0  1.0
sthlm  2.0  0.0  0.0
syd    0.0  2.0  0.0

我终于可以画出来了

result.plot.bar(stacked=True)

plt.show()

这给了我


完整的工作代码:

import pandas as pd
import matplotlib.pyplot as plt

C_code = ['a', 'a', 'b', 'a', 'c', 'a', 'b', 'a']
F_namn = ['sthlm', 'norr', 'syd', 'norr', 'norr', 'sthlm', 'syd', 'norr']
D_namn = ['ff', 'rr', 'ff', 'gg', 'ff', 'rr', 'rr', 'ff']

df_test = pd.DataFrame({
    'C_code': C_code,
    'F_namn': F_namn,
    'D_namn': D_namn
})

print(df_test)

result = pd.DataFrame(index=['a', 'b', 'c'])

for name, data in df_test.groupby('F_namn'):
    #print(name)
    #print(data['C_code'].value_counts())
    result[name] = data['C_code'].value_counts()

print(result)
    
result = result.fillna(0)  # put `zero` 
result = result.T  # transpose

print(result)

result.plot.bar(stacked=True)

plt.show()

【讨论】:

  • 非常感谢,这正是我想要的!
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2020-11-20
  • 2011-02-11
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多