总结一个Pandas数据帧

时间:2017-02-03 08:02:11

标签: python pandas dataframe pycharm

我在PyCharm Community Edition 2016.3.2中运行Python 3.6和Pandas 0.19.2,并且我正在尝试确保数据框中的一组行加起来为1.

最初,我的数据框如下所示:

 hello     world     label0    label1    label2
 abc       def       1.0       0.0       0.0
 why       not       0.33      0.34      0.33
 hello     you       0.33      0.38      0.15

我按照以下步骤进行:

# get list of label columns (all column headers that contain the string 'label')
label_list = df.filter(like='label').columns

# ensure every row adds to 1
if (df[label_list].sum(axis=1) != 1).any():
    print('ERROR')

不幸的是,这段代码对我不起作用。似乎正在发生的是,我只是获取过滤数据中第一列的值,而不是对行进行求和。换句话说:df[label_list].sum(axis=1)返回:

0     1.0
1     0.33
2     0.33

这应该是微不足道的,但我无法弄清楚我做错了什么。在前面感谢您的帮助!

更新:

在我筛选标签列后,这是我原始数据的摘录:

    label0 label1 label2 label3 label4 label5 label6 label7 label8
1    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
2    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
3    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
4    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
5    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
6    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
7    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
8    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2
9    0.34    0.1    0.1    0.1    0.2    0.4    0.1    0.1    1.2

我上面的代码仍然不起作用,我仍然完全不知道为什么。当我在python控制台中运行我的代码时,一切都运行得很好,但是当我在Pycharm 2016.3.2中运行我的代码时,label_data.sum(axis=1)只返回第一列的值。

2 个答案:

答案 0 :(得分:0)

我的样本数据可行。只需尝试重现您的示例,添加新列check即可控制总和:

In [3]: df
Out[3]: 
   hello world  label0  label1  label2
0    abc   def    1.00    0.00    0.00
1    why   not    0.33    0.34    0.33
2  hello   you    0.33    0.38    0.15

In [4]: df['check'] = df.sum(axis=1)

In [5]: df
Out[5]: 
   hello world  label0  label1  label2  check
0    abc   def    1.00    0.00    0.00   1.00
1    why   not    0.33    0.34    0.33   1.00
2  hello   you    0.33    0.38    0.15   0.86

In [6]: label_list = df.filter(like='label').columns

In [7]: label_list
Out[7]: Index([u'label0', u'label1', u'label2'], dtype='object')

In [8]: df[label_list].sum(axis=1)
Out[8]: 
0    1.00
1    1.00
2    0.86
dtype: float64

In [9]: if (df[label_list].sum(axis=1) != 1).any():
   ...:     print('ERROR')
   ...:     
ERROR

答案 1 :(得分:0)

原来我的数据类型不一致。我使用astype(float)并且事情已经解决了。