Обновите фрейм данных, чтобы внутренне суммировать его элементы

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных (df), состоящий из float64, который я хочу, по сути, «сложить сам по себе». В настоящее время он проиндексирован на 0-30, и мне он нужен на 0-9, объединяя элементы, которые заканчиваются одной и той же цифрой (0 с 10, 20 и 30; 1 с 11, 21 и т.д.) Так что что-то вроде:

 for i in df:  for x in df[i]:  df[i][x] = df[i][x]   df[i][x   10]   df[i][x   20]   df[i][x   30]  

По какой-то причине я получаю ошибку ключа, выводящую первый [i][x]

Комментарии:

1. Можете ли вы предоставить некоторые примеры данных с ожидаемым результатом?

Ответ №1:

ИЗМЕНИТЬ: этот же метод может быть применен к любому столбцу, а не только к индексу. Первоначально я интерпретировал вопрос как вопрос о группировке индексов, но я думаю, что, возможно, неправильно понял этот момент. OP, если вы хотите сделать это для значений в столбце x , то сделайте df.groupby(df["x"] % 10).sum() это .

Решение

Вы можете использовать групповую и модульную арифметику:

 df.groupby(df.index % 10).sum()  

Объяснение

Чтобы показать, как это работает, возьмите этот образец фрейма данных:

 In [3]: df Out[3]:  a b 0 0.92 0.21 1 0.17 0.91 2 0.52 0.34 3 0.11 0.50 4 0.23 0.15 5 0.14 0.34 6 0.41 0.83 7 0.11 0.79 8 0.13 0.01 9 0.23 0.25 10 0.24 0.00 11 0.59 0.64 12 0.58 0.16 13 0.20 0.02 14 0.37 0.65 15 0.06 0.21 16 0.26 0.47 17 0.30 0.98 18 0.79 0.45 19 0.70 0.55  

Использование df.groupby(df.index % 10) для группировки индексов, которые заканчиваются одной и той же цифрой, и печать групп:

 In [4]: df.groupby(df.index % 10).apply(print)  a b 0 0.92 0.21 10 0.24 0.00  a b 1 0.17 0.91 11 0.59 0.64  a b 2 0.52 0.34 12 0.58 0.16  a b 3 0.11 0.50 13 0.20 0.02  a b 4 0.23 0.15 14 0.37 0.65  a b 5 0.14 0.34 15 0.06 0.21  a b 6 0.41 0.83 16 0.26 0.47  a b 7 0.11 0.79 17 0.30 0.98  a b 8 0.13 0.01 18 0.79 0.45  a b 9 0.23 0.25 19 0.70 0.55  

Теперь вместо .apply(print) того, чтобы просто .sum() вместо этого получить сумму каждой группы:

 In [5]: df.groupby(df.index % 10).sum() Out[5]:  a b 0 1.16 0.21 1 0.76 1.55 2 1.10 0.50 3 0.31 0.52 4 0.60 0.80 5 0.20 0.55 6 0.67 1.30 7 0.41 1.77 8 0.92 0.46 9 0.93 0.80  

Комментарии:

1. Это работает. Большое вам спасибо!

2. Отлично, рад, что смог помочь. Продолжайте и отметьте ответ как принятый, чтобы ваш вопрос можно было удалить из очереди без ответа.