我在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)
只返回第一列的值。
答案 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)
并且事情已经解决了。