2015-09-22 3 views
1

У меня есть DataFrame с 40 столбцов (колонок от 0 до 39), и я хочу, чтобы сгруппировать их четыре, в то время:Объединение нескольких столбцов в DataFrame

import numpy as np 
import pandas as pd 
df = pd.DataFrame(np.random.binomial(1, 0.2, (100, 40))) 

new_df["0-3"] = df[0] + df[1] + df[2] + df[3] 
new_df["4-7"] = df[4] + df[5] + df[6] + df[7] 
... 
new_df["36-39"] = df[36] + df[37] + df[38] + df[39] 

Могу ли я сделать это в одном заявлении (или лучше, чем суммирование их отдельно)? Имена столбцов в новом DataFrame не важны.

ответ

0

Я не знаю, если это лучший путь, но я в конечном итоге с помощью мультииндексных:

df.columns = pd.MultiIndex.from_product((range(10), range(4))) 
new_df = df.groupby(level=0, axis=1).sum() 

Обновление: Возможно, из-за индекса, это быстрее, чем альтернативные варианты. То же самое можно сделать с df.groupby(df.columns//4, axis=1).sum() быстрее, если учесть время для построения индекса. Тем не менее, изменение индекса является одноразовой операцией, и я обновляю df и беру сумму в тысячи раз, поэтому использование MultiIndex было быстрее для меня.

2

Вы можете выбрать столбцы и суммировать на оси строк, например.

df['0-3'] = df.loc[:, 0:3].sum(axis=1) 

Пара вещей, чтобы отметить:

  1. Подытоживая, как это будет игнорировать недостающие данные в то время как df[0] + df[1] ... распространяется его. Пройдите skipna=False, если вы хотите этого поведения.
  2. Не обязательно какое-либо преимущество в производительности, на самом деле может быть немного медленнее.
0

Рассмотрим список понимание:

df = # your data 
df_slices = [df.iloc[x:x+4] for x in range(10)] 

или в более общем

df_slices = [df.iloc[x:x+4] for x in range(len(df.columns)/4)] 
2

Вот еще один способ сделать это:

new_df = df.transpose() 
new_df['Group'] = new_df.index/4 
new_df = new_df.groupby('Group').sum().transpose() 

Обратите внимание, что деление на операции здесь integer division , а не с плавающей точкой.

Смежные вопросы