Панды, суммируйте определенный диапазон ячеек подряд - PullRequest
0 голосов
/ 04 сентября 2018

Имеет следующий Pandas DataFrame Strings :

  key  0 1-9 10-18 19-27 28-36 37-45 46-54 55-63 64-72 73-81 82-90 91-99 100
1   A  1   2     1     4     1     1     1     7     1     3     1     1   1
2   B  3   1     1     1     6     1     1     1     7     1     8     1   1
3   C  1   1     2     1     1     1     1     1     1     1     1     1   1

Я хотел бы получить сумму ячеек определенной строки, поэтому, например, для первой строки (клавиша A) результат должен быть 25 (1 + 2 + 1 + 4 + 1 + 1 + 1 + 7 + 1 + 3 + 1 + 1 + 1).

Как бы вы подошли к такой проблеме?

1 Ответ

0 голосов
/ 04 сентября 2018

Если значения в key являются уникальными и должны быть выбраны по метке:

Создать индекс по столбцу key по set_index, затем выбрать по DataFrame.loc:

#select return Series
print (df.set_index('key').loc['A'])
0        1
1-9      2
10-18    1
19-27    4
28-36    1
37-45    1
46-54    1
55-63    7
64-72    1
73-81    3
82-90    1
91-99    1
100      1
Name: A, dtype: int64

out = df.set_index('key').loc['A'].sum()

Или сначала создайте index, затем sum, а затем выберите Series.at или Series.loc:

#sum return Series
print (df.set_index('key').sum(axis=1))
key
A    25
B    33
C    14
dtype: int64

out = df.set_index('key').sum(axis=1).at['A']
out = df.set_index('key').sum(axis=1)['A']
out = df.set_index('key').sum(axis=1).loc['A']

Или отфильтруйте сначала по boolean indexing, а затем sum:

#filtering create one row DataFrame
print (df[df['key'] == 'A'])
  key  0  1-9  10-18  19-27  28-36  37-45  46-54  55-63  64-72  73-81  82-90  \
1   A  1    2      1      4      1      1      1      7      1      3      1   

   91-99  100  
1      1    1  


out = df[df['key'] == 'A'].sum(axis=1).item()

Если значения в key должны дублироваться и должны быть выбраны по метке:

print (df)
  key  0  1-9  10-18  19-27  28-36  37-45  46-54  55-63  64-72  73-81  82-90  \
1   A  1    2      1      4      1      1      1      7      1      3      1   
2   A  3    1      1      1      6      1      1      1      7      1      8   
3   C  1    1      2      1      1      1      1      1      1      1      1   

   91-99  100  
1      1    1  
2      1    1  
3      1    1  

Сначала возможно преобразовать отфильтрованные значения в массив numpy на values, а затем sum из 2d array:

out = df.set_index('key').loc['A'].values.sum()

Double sum - первый sum create Series и второй sum return scalar:

out = df.set_index('key').loc['A'].sum().sum()
out = df.set_index('key').sum(axis=1).at['A'].sum()

При необходимости выберите по позициям :

Используйте DataFrame.iloc или Series.iat, Series.iloc:

out = df.set_index('key').iloc[0].sum()

out = df.set_index('key').sum(axis=1).iat[0]
out = df.set_index('key').sum(axis=1).iloc[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...