2017-02-03 6 views
2

Я бег на Python 3.6 и панда 0.19.2 в PyCharm Community Edition 2016.3.2 и пытаются обеспечить набор строк в моей dataframe добавляет к 1.суммирования панды Dataframe

Первоначально мой dataframe выглядит так следующим образом:

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 

Это должно быть тривиальным, но я просто не могу понять, что я делаю неправильно. Спасибо за помощь!

UPDATE:

Это выдержка из моих исходных данных после того, как я фильтруется для столбцов метки:

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

Что возвращает 'label_list = df.filter (like = 'label'). Columns'? – jezrael

+0

Кажется, что что-то не так с именами столбцов, проверьте его с помощью 'print (df.columns.tolist())' – jezrael

+0

Для вашего образца он возвращает '['hello', 'world', 'label0', 'label1', 'label2'] ' – jezrael

ответ

0

Оказывается, мой тип данных не соответствует. Я использовал astype(float) и все получилось.

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 
+0

Вы правы. Код отлично работает в консоли python. – MRR