Как сумма столбцов с одинаковым именем [дублировать]

, когда у меня такая же проблема. если вы используете файлы классов библиотеки и записываете его в файлы манифеста android, напишите его так же, как и затем удалите файлы манифеста проектов библиотеки этой части >> тогда он будет работать абсолютно.

3
задан Amanda 2 March 2016 в 13:09
поделиться

2 ответа

Я предлагаю вам сделать что-то другое, это выполнить транспонирование, группу по префиксу строк (ваши исходные столбцы), sum и транспонировать снова.

Рассмотрим следующее:

df = pd.DataFrame({
        'a_a': [1, 2, 3, 4],
        'a_b': [2, 3, 4, 5],
        'b_a': [1, 2, 3, 4],
        'b_b': [2, 3, 4, 5],
    })

Теперь

[s.split('_')[0] for s in df.T.index.values]

является префиксом столбцов. Таким образом,

>>> df.T.groupby([s.split('_')[0] for s in df.T.index.values]).sum().T
    a   b
0   3   3
1   5   5
2   7   7
3   9   9

делает то, что вы хотите.

В вашем случае обязательно разделите, используя символ '-'.

4
ответ дан Ami Tavory 16 August 2018 в 04:50
поделиться
  • 1
    groupby принимает аргумент axis = 1, поэтому может работать что-то вроде df.groupby(df.columns.str.split("-").str[0],axis=1).sum(). (Столбец Histo заставляет меня задаться вопросом, нужно ли нам использовать другое условие группировки, но вы получите идею.) – DSM 2 March 2016 в 13:24
  • 2
    @DSM Отличная точка - не знал об этом. Большое спасибо! – Ami Tavory 2 March 2016 в 13:39

Использование блестящей идеи DSM:

from __future__ import print_function

import pandas as pd

categories = set(['Economics', 'English', 'Histo', 'Literature'])

def correct_categories(cols):
    return [cat for col in cols for cat in categories if col.startswith(cat)]    

df = pd.read_csv('data.csv', sep=r'\s+', index_col='Id')

#print(df)
print(df.groupby(correct_categories(df.columns),axis=1).sum())

Выход:

    Economics  English  Histo  Literature
Id
56          1        1      2           1
11          1        0      0           1
6           1        1      0           0
43          2        0      1           1
14          1        1      1           0

Вот еще одна версия, которая заботится о «Histo / History» проблематичной ..

from __future__ import print_function

import pandas as pd

#categories = set(['Economics', 'English', 'Histo', 'Literature'])

#
# mapping: common starting pattern: desired name
#
categories = {
    'Histo': 'History',
    'Economics': 'Economics',
    'English': 'English',
    'Literature': 'Literature'
}

def correct_categories(cols):
    return [categories[cat] for col in cols for cat in categories.keys() if col.startswith(cat)]

df = pd.read_csv('data.csv', sep=r'\s+', index_col='Id')
#print(df.columns, len(df.columns))
#print(correct_categories(df.columns), len(correct_categories(df.columns)))
#print(df.groupby(pd.Index(correct_categories(df.columns)),axis=1).sum())

rslt = df.groupby(correct_categories(df.columns),axis=1).sum()
print(rslt)
print('History\n', rslt['History'])

Выход:

    Economics  English  History  Literature
Id
56          1        1        2           1
11          1        0        0           1
6           1        1        0           0
43          2        0        1           1
14          1        1        1           0
History
 Id
56    2
11    0
6     0
43    1
14    1
Name: History, dtype: int64

PS Вы можете захотеть добавить отсутствующие категории в categories map / dictionary

2
ответ дан MaxU 16 August 2018 в 04:50
поделиться
  • 1
    Спасибо за ваш ответ, огромное решение, но у меня возникла проблема с доступом к столбцам: с вашими методами я всегда делал keyError даже после попытки использования разных решений кодирования при чтении CSV. Даже когда я пытаюсь принять df['History'], у меня есть ошибка, но нет ошибки с df.get('history') – Amanda 2 March 2016 в 16:36
  • 2
    @ Аманда, одна из ваших колонок имела имя «Histo» в качестве имени, поэтому я решил использовать «Histo». как общее имя, в противном случае у вас будут оба: Histo и History. Попробуйте вместо этого df ['Histo'] – MaxU 2 March 2016 в 16:47
  • 3
    @Amanda, что бы вы хотели сделать с колонкой Histo? Вы хотите иметь и «Histo», и "История" в кадре данных результата? – MaxU 2 March 2016 в 16:56
  • 4
    спасибо за ваш ответ, на самом деле проблема заключается не только в истории, но и в доступе к имени столбца в целом: stackoverflow.com/questions/35764172/… ! ваш ответ хорош, но когда есть несколько кадров данных, которые следует обрабатывать, KeyError блокирует все – Amanda 3 March 2016 в 06:48
Другие вопросы по тегам:

Похожие вопросы: