2016-02-15 2 views
-1

у меня есть очень большой файл данных, который может быть смоделирован на код ниже:Добавить столбец панд DataFrame на основе значений двух других столбцов с помощью GroupBy()

import pandas as pd 
import numpy as np 
import random 

x = pd.DataFrame({'file_name': np.repeat(['csv_1', 'csv_2'], 32), 
        'side': np.tile(np.repeat(['n', 'f'], 16),2), 
        'ten_13':np.tile(np.repeat(['10', '13'], 8),4), 
        'rand_data': np.random.uniform(-1, 1, size=64)}) 

x = x.set_index(['file_name', 'side', 'ten_13']) 
x.head() 

Мне нужна ваша помощь, чтобы добавить колонку под названием web_colс использованием метода groupand() pandas '' (), приведенного выше DataFrame x.

Колонна web_col зависит от комбинации значений в столбцах side, ten_13 и имеет одно из четырех возможных значений последовательности:

  • 1: 8, если значение «стороны» = «п» и «ten_13 '=' 10 '
  • 9:16 если значение' side '=' n 'и' ten_13 '=' 13 '
  • 17:24 если значение' side '=' f 'и' ten_13 '=' 10 '
  • 25:32 если значение' side '=' f 'и' ten_13 '=' 13 '

file_name содержит различные файлы csv; в приведенном ниже коде есть только два файла. Каждый файл имеет точные точные значения side и ten_13.

Я создал этот web_col столбец с помощью функции Numpy np.where(), но я хотел бы использовать панда GroupBy() вместо этого. np.where() код ниже:

ten_13 = x.index.get_level_values('ten_13') 
side = x.index.get_level_values('side') 

n_10 = ((ten_13 == '10') & (side == 'n')).reshape(-1,8) 
n_13 = ((ten_13 == '13') & (side == 'n')).reshape(-1,8) 
f_10 = ((ten_13 == '10') & (side == 'f')).reshape(-1,8) 
f_13 = ((ten_13 == '13') & (side == 'f')).reshape(-1,8) 

web_col = np.where(n_10, np.arange(1, 9, 1), 
        np.where(f_10, np.arange(17, 25, 1), 
          np.where(n_13, np.arange(9, 17, 1), 
            np.where(f_13, np.arange(25,33, 1), np.arange(1, 9, 1))))) 
x['web_col'] = web_col.reshape(64,1) 
x.head() 
+0

Почему вы хотите использовать groupby() специально? groupby() не кажется правильным инструментом для этой проблемы. groupby() отлично подходит для создания группы, над которой вы будете выполнять некоторую агрегацию, но это не ваша цель. Возможно, apply() более уместен? – SPKoder

+0

Поскольку мне нужно знать больше о groupby(), Какой инструмент, по вашему мнению, подходит для этой проблемы? –

+0

Попробуйте [применить] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html). См. [Этот вопрос] (http://stackoverflow.com/questions/21702342/creating-a-new-column-based-on-if-elif-else-condition) для хорошего примера –

ответ

-1

Вы могли использовать pandas.apply() для этого, но, учитывая, что у вас есть только 4 условия, следующий, вероятно, более эффективным.

x.loc[(x['side'] == 'n') & (x['ten_13'] == '10'), 'web_col'] = '1:8' 
... for each condition 

Если вы установите соответствующие индексы, это будет еще быстрее.

x.set_index(['side', 'ten_13'], inplace=True) 
x.sortlevel(inplace=True) # speeds up lookups 
x.loc[('n', '10'), 'web_col'] = '1:8' 
... for each condition 
x.reset_index(inplace=True) # to restore original dataframe 
+0

спасибо, но код, который вы предоставили не работает для данных модели. Кроме того, я попросил решение быть с методом groupby() –

+0

В коде была опечатка - также, groupby - неправильный инструмент для работы здесь. –

+0

У вашего кода есть опечатка или моя? Я понимаю, но я попросил группу(). Обратите внимание, что я предоставил способ создания столбца с помощью np.where(). Цель состоит в том, чтобы я изучил groupby() –

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