2016-04-21 2 views
1

Я пытаюсь умножить строку в DataFrame на основе столбца условия.pandas: эффективно умножать строку на основании условия

Например, когда значение столбца условий равно 2, Я хотел бы заменить строку с двумя одинаковыми строками и установить условия в каждой новой строки на 1.

Пример DataFrame:

df = pd.DataFrame({'k': ['K0', 'K1', 'K1', 'K2'], 
       'condition': [1, 1, 3, 2], 
       's': ['a', 'b', 'c', 'd']}) 


    condition k s 
      1 K0 a 
      1 K1 b 
      3 K1 c 
      2 K2 d 

Желаемый результат:

condition k s 
      1 K0 a 
      1 K1 b 
      1 K1 c 
      1 K1 c 
      1 K1 c 
      1 K2 d 
      1 K2 d 

Может ли эта операция будет сделано inplace эффективно, без создания временного df?

ответ

1

Быстрее использовать loc и np.repeat:

df = df.loc[np.repeat(df.index.values,df.condition)].reset_index(drop=True) 
df['condition'] = 1 
print df 
    condition k s 
0   1 K0 a 
1   1 K1 b 
2   1 K1 c 
3   1 K1 c 
4   1 K1 c 
5   1 K2 d 
6   1 K2 d 

Другое решение с groupby с concat и последний набор значений в столбце condition к 1, но медленнее:

df = df.groupby('condition', as_index=False, sort=False) 
     .apply(lambda x: pd.concat([x]*x.condition.values[0], ignore_index=True)) 
     .reset_index(drop=True) 
df['condition'] = 1 
print df 
    condition k s 
0   1 K0 a 
1   1 K1 b 
2   1 K1 c 
3   1 K1 c 
4   1 K1 c 
5   1 K2 d 
6   1 K2 d 

Timings:

In [917]: %timeit df.loc[np.repeat(df.index.values,df.condition)].reset_index(drop=True) 
The slowest run took 4.55 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 1.04 ms per loop 

In [918]: %timeit df.groupby('condition', as_index=False, sort=False).apply(lambda x: pd.concat([x]*x.condition.values[0], ignore_index=True)).reset_index(drop=True) 
100 loops, best of 3: 7.78 ms per loop 
+0

Спасибо @jezrael, мне нравится ваше решение. Я согласен с вами по второму варианту, 'groupby' выглядит медленнее – Toren

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