【问题标题】:Create python pandas histograms for specific row range as well as iterating through columns?为特定行范围创建 python pandas 直方图以及遍历列?
【发布时间】:2017-11-03 01:38:40
【问题描述】:

我有一组数据,我转置以将数据组放入行中,并在列中具有占位符值(对于我的情况,一系列质量值)。我的下一个目标是为包含相同字符的每一行绘制直方图,如下所示:

mz     902.4  909.4   915.3
n       0.6    0.3     1.4
n.1     0.4    0.3     1.3
n.2     0.3    0.2     1.1
n.3     0.2    0.2     1.3
n.4     0.4    0.3     1.4
DCIS           0.3     1.6
DCIS.1  0.3    1.2
DCIS.2         1.1
DCIS.3  0.2    1.2
DCIS.4  0.2    1.3
DCIS.5  0.2    0.1     1.5
br_1    0.5    0.4     1.4
br_1.1         0.2     1.3
br_1.2  0.5    0.2     1.4
br_1.3  0.5    0.2     1.6
br_1.4         1.4

我的目标是从 902.4 开始为那些字母 n 作为第 1 组、DCIS 作为第 2 组的人绘制直方图,并且这些组要在同一个直方图中。然后我计划通过列迭代相同的过程,因此代码应该产生相同数量的直方图列。

以下是我目前的代码(输入文件是转置前的 excel xlsx 文件):

nh = pd.ExcelFile(nheight)
df = pd.read_excel(nh, index=False)

dfn = df.filter(like='n', axis=0)
dfbr1234 = df.filter(like='br', axis=0)

plt.figure()
plt.hist([dfn, dfbr1234], bins=50)
plt.show()

我试图将带有字母“br”的行组合成一个组,仅用于测试,但它产生的零大小数组是减少操作的最小值,没有身份错误。

编辑: 所以数据框是上面的表格。

我想要做的是绘制一个直方图,其中包含 3 个单独的直方图,由上面屏幕截图中的黑色、红色和橙色框指定。目标是比较单个图中的不同框,我想进行迭代,以便我可以对其他两列(图片中的第 2 和第 3 列)执行相同的操作。我尝试使用 df.filter 函数来过滤 'like='n'' 等等,但我不确定如何组合不同的过滤数据以及遍历列。上面的代码还没有迭代,但我正在考虑使用 iloc[:,variable] 进行迭代。

【问题讨论】:

  • 我认为提供的代码很难理解您的问题。您可以将您的问题转换为 MCVE 吗?即,您想从顶部的数据框中实现什么?
  • 为澄清而编辑了帖子。

标签: python pandas histogram


【解决方案1】:

这是一种基本的方法,

df = pd.read_clipboard()
df = df.fillna(0)
print(df)

        mz  902.4  909.4  915.3
0        n    0.6    0.3    1.4
1      n.1    0.4    0.3    1.3
2      n.2    0.3    0.2    1.1
3      n.3    0.2    0.2    1.3
4      n.4    0.4    0.3    1.4
5     DCIS    0.3    1.6    0.0
6   DCIS.1    0.3    1.2    0.0
7   DCIS.2    1.1    0.0    0.0
8   DCIS.3    0.2    1.2    0.0
9   DCIS.4    0.2    1.3    0.0
10  DCIS.5    0.2    0.1    1.5
11    br_1    0.5    0.4    1.4
12  br_1.1    0.2    1.3    0.0
13  br_1.2    0.5    0.2    1.4
14  br_1.3    0.5    0.2    1.6
15  br_1.4    1.4    0.0    0.0

制作子集(如果逻辑可以很好定义,这一步可以进入下面的迭代),

df_n = df.loc[df['mz'].str.startswith('n')]
df_D = df.loc[df['mz'].str.startswith('D')]
df_b = df.loc[df['mz'].str.startswith('b')]

使用matplotlibsubplots()

import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=df.shape[1]-1,ncols=1)
plt.tight_layout()

for i in range(1,df.shape[1]):
    df_n.iloc[:,i].hist(ax=ax[i-1],color = 'k', alpha=0.4) # reduced alpha because you're plotting many histograms on top of each other
    df_D.iloc[:,i].hist(ax=ax[i-1],color = 'r', alpha=0.4)
    df_b.iloc[:,i].hist(ax=ax[i-1],color = 'orange', alpha=0.4)
    ax[i-1].set_title("Histograms for " + df.columns[i])

【讨论】:

  • 我刚刚意识到转置数据会以某种方式丢失左上角的值(对于这种情况,'mz'),所以转置表的左上角位置只是一个空白。我尝试使用 iloc[:,0] 而不是 df['mz'] 但这给了我一个错误。我使用 set_index 函数进行转置,因为当我转置数据时,它会在列的顶部添加索引值。
  • 在没有看到实际数据的情况下不能发表太多评论。 df.columns[0] = 'mz' 可能有用。
  • 也许用 MCVE 再问一个问题? :) 不要编辑这篇文章,因为这是一个不同的问题
  • 对不起,我想我跑题了。当我尝试您的建议时,我确实遇到了另一个问题。对于最后一行(set_title 行),它给出了一个类型错误:必须是 str,而不是 float。我确实了解 902.4 和其他数字是浮动数字。我尝试使用 df.astype(int).astype(str) 但这没有用。有什么建议吗?
  • df.columns的输出是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2021-03-06
  • 1970-01-01
  • 2019-09-12
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多