如何转换pandas数据帧,使index是唯一的值集,data是每个值的计数?

How to convert pandas dataframe so that index is the unique set of values and data is the count of each value?

提问人:dailyglen 提问时间:6/6/2012 最后编辑:piRSquareddailyglen 更新时间:1/5/2017 访问量:3323

问:

我有一个多项选择题,它的格式是这样的:dataframe

      Sex Qu1  Qu2  Qu3
Name
Bob    M   1    2    1
John   M   3    3    5
Alex   M   4    1    2
Jen    F   3    2    4
Mary   F   4    3    4

数据是 3 道多项选择题的评分从 1 到 5。我想重新排列数据,使索引为 range(1,6),其中 1='bad', 2='poor', 3='ok', 4='good', 5='excellent',列相同,数据是值的出现次数计数(不包括 列)。这基本上是固定图格大小和用字符串标记的 x 轴的直方图。我喜欢比这更好的输出,但我不知道如何重新排列表格以给我一个数据直方图。另外,如何将 x 标签更改为字符串?df.plot()df.hist()

Python 熊猫

评论


答:

17赞 Wes McKinney 6/6/2012 #1

Series.value_counts为您提供所需的直方图:

In [9]: df['Qu1'].value_counts()
Out[9]: 
4    2
3    2
1    1

因此,将此函数应用于这 3 列中的每一列:

In [13]: table = df[['Qu1', 'Qu2', 'Qu3']].apply(lambda x: x.value_counts())

In [14]: table
Out[14]: 
   Qu1  Qu2  Qu3
1    1    1    1
2  NaN    2    1
3    2    2  NaN
4    2  NaN    2
5  NaN  NaN    1

In [15]: table = table.fillna(0)

In [16]: table
Out[16]: 
   Qu1  Qu2  Qu3
1    1    1    1
2    0    2    1
3    2    2    0
4    2    0    2
5    0    0    1

使用 或 可以重新排列数据。table.reindextable.ix[some_array]

若要转换为字符串,请使用 table.rename:

In [17]: table.rename(index=str)
Out[17]: 
   Qu1  Qu2  Qu3
1    1    1    1
2    0    2    1
3    2    2    0
4    2    0    2
5    0    0    1

In [18]: table.rename(index=str).index[0]
Out[18]: '1'

评论

0赞 dailyglen 6/7/2012
这正是我所需要的。谢谢。我发现的一个问题是,当我将数据归一化为百分比(每列)并使用某些索引的名称,然后绘制它时,x 轴标签被错误地压扁到左侧。如果我将索引保留为整数或数据值为整数,它可以正常工作。