столбцы суммы панд питона в столбец суммы - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу создать столбец в фрейме данных pandas, который бы добавил значения других столбцов (которые равны 0 или 1).столбец называется «сумма»

мой HEADPandas выглядит как:

     Application  AnsSr sum  Col1 Col2 Col3 .... Col(n-2) Col(n-1) Col(n)
date 28-12-11      0.0   0.0  28/12/11      ....    ...Dates...    28/12/11
~00c        0      0.0   0.0  0    0     0  ....    0       0       0
~00pr       0      0.0   0.0  0    0     0  ....    0       0       0
~00te       0      0.0   0.0  0    0     1  ....    0       0       1

на изображении из pythoneverywhere: enter image description here

ожидаемый результат(при условии, что больше не будет столбцов

     Application  AnsSr sum  Col1  Col2  Col3 .... Col(n-2) Col(n-1) Col(n)
date 28-12-11      0.0   nan  28/12/11        ....    ...Dates...    28/12/11
~00c        0      0.0   0.0   0    0     0  ....    0      0        0
~00pr       0      0.0   0.0   0    0     0  ....    0      0        0
~00te       0      0.0   2     0    0     1  ....    0      0        1

, поскольку вы видите, что значения 'sum' сохраняются в 0, даже если в некоторых столбцах есть значения 1s. Что я делаю неправильно?

Основы кода:

theMatrix=pd.DataFrame([datetime.today().strftime('%Y-%m-%d')],['Date'],['Application'])
theMatrix['Ans'] = 0
theMatrix['sum'] = 0

пока все хорошо, тогда я добавляю все значения с помощью loc., А затем я хочу сложить значения с помощью

theMatrix.fillna(0, inplace=True)
# this being the key line:
theMatrix['sum'] = theMatrix.sum(axis=1)
theMatrix.sort_index(axis=0, ascending=True, inplace=True)

Как высм. в результате (прилагаемое изображение) сумма остается 0. Я посмотрел здесь или здесь и панд документация безрезультатно.выражение:

theMatrix['sum'] = theMatrix.sum(axis=1)

Я получил его оттуда.

изменив эту последнюю строку на:

theMatrix['sum'] = theMatrix[3:0].sum(axis=1)

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

     Application  AnsSr sum  Col1  Col2  Col3 .... Col(n-2) Col(n-1) Col(n)
date 28-12-11      0.0   nan  28/12/11        ....    ...Dates...    28/12/11
~00c        0      0.0   nan   1    1     0  ....    0      0        0
~00pr       0      0.0   1.0   0    0     0  ....    0      0        1
~00te       0      0.0   0     0    0     0  ....    0      0        0

пожалуйста, обратите внимание на две вещи: a) как в строке '~ 00c' сумма равна nan, но в этом ряду 1.б) перед вычислением суммы код theMatrix.fillna (0, inplace = True) должен изменить все возможные значения nan на 0, поэтому сумма никогда не должна быть равна nan, поскольку в теории ни в одном из столбцов нет значений nan [3:]

это не сработает.

какая-то идея?

спасибо

PS: более поздняя редакция, на случай, если вам интересно, как заполняется информационный кадр: чтениеи синтаксический анализ XML и строки:

# myDocId being the name of the columns
# concept being the index.
theMatrix.loc[concept,myDocId]=1 

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Любые данные, которые вы выбираете для суммирования, просто добавьте в список и используйте этот список для предоставления вашей функции суммирования с осью = 1.Это обеспечит вам желаемый результат.Вот пример, связанный с вашими данными.

Пример файла данных:

Date,a,b,c
bad, bad, bad, bad # Used to simulate your data better
2018-11-19,1,0,0
2018-11-20,1,0,0
2018-11-21,1,0,1
2018-11-23,1,nan,0 # Nan here is just to represent the missing data
2018-11-28,1,0,1
2018-11-30,1,nan,1 # Nan here is just to represent the missing data
2018-12-02,1,0,1

Код:

import pandas as pd
df = pd.read_csv(yourdata.filename) # Your method of loading the data
#rows_to_sum = ['a','b','c'] # The rows you wish to summarize
rows_to_sum = df.columns[1:] # Alternate method to select remainder of rows.
df = df.fillna(0) # used to fill the NaN you were talking about below. 
df['sum'] = df[rows_to_sum][1:].astype(int).sum(axis=1) # skip the correct amount of rows here. 
# Also, the use of astype(int), is due to the bad data read from the top. So redefining it here, allows you to sum it appropriately. 
print(df)

Выход:

       Date     a     b     c  sum
        bad   bad   bad   bad  NaN
 2018-11-19     1     0     0  1.0
 2018-11-20     1     0     0  1.0
 2018-11-21     1     0     1  2.0
 2018-11-23     1     0     0  1.0
 2018-11-28     1     0     1  2.0
 2018-11-30     1     0     1  2.0
 2018-12-02     1     0     1  2.0
0 голосов
/ 11 декабря 2018

Если я правильно понимаю, это может вам помочь:

import pandas as pd
import datetime

#create dataframe following your example
theMatrix=pd.DataFrame([datetime.datetime.today().strftime('%Y-%m-%d')],['Date'],['Application'])
theMatrix['Ans'] = 0
theMatrix['col1'] = 1
theMatrix['col2'] = 1

# create 'sum' column with summed values from certain columns
theMatrix['sum'] = theMatrix['col1'] + theMatrix['col2']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...