#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. Отлично, рад, что смог помочь. Продолжайте и отметьте ответ как принятый, чтобы ваш вопрос можно было удалить из очереди без ответа.