2016-06-25 8 views
0

У меня есть dataframe 'dayData', и я пытаюсь связать столбец 'second_step' в dataframe (записывая результат в новый столбец, называемый (изначально) 'third_step'). Данные выглядит следующим образом:Ограничение столбца в dataframe

second_step 
0  0.185185 
1  0.148148 
2  0.148148 
3   0 
4  0.185185 
5   0 
6   0 
7   0 
8  0.148148 
9  0.185185 
10   0 

с использованием линии:

dayData["third_step"] = max(min(dayData["second_step"],2),-2) 

Однако я получаю исключение:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Может кто-то дайте мне знать, что это значит, пожалуйста, как тип данных является dataframe (Type <class 'pandas.core.frame.DataFrame'>), поскольку я очень смущен.

Благодаря

ответ

2

Я бы порекомендовал вам использовать векторизованные функции для этого - она ​​должна быть быстрее по сравнению с apply() подхода:

df['third_tep'] = np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 

In [43]: df 
Out[43]: 
    second_step third_tep 
0  0.185185 0.185185 
1  0.148148 0.148148 
2  0.148148 0.148148 
3  6.000000 2.000000 
4  0.185185 0.185185 
5  0.000000 0.000000 
6  -5.000000 -2.000000 
7  0.000000 0.000000 
8  0.148148 0.148148 
9  0.185185 0.185185 
10  0.000000 0.000000 

газораспределительных против 1.1M строки DF:

In [44]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [45]: df.shape 
Out[45]: (1100000, 2) 

In [47]: %timeit df.second_step.apply(bounded) 
1 loop, best of 3: 996 ms per loop 

In [48]: %timeit np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 
100 loops, best of 3: 16.4 ms per loop 

Заключение: векторизованный подход ч ок. 61 раз быстрее ...

0

Вы можете использовать apply

bounded = lambda x: max(min(x, 2), -2) 
dayData["third_step"] = dayData.second_step.apply(bounded) 
0

есть метод панды, чтобы сделать это, clip:

In [6]: 
df['third_step'] = df['second_step'].clip(-.1,.1) 
df 

Out[6]: 
    second_step third_step 
0  0.185185   0.1 
1  0.148148   0.1 
2  0.148148   0.1 
3  0.000000   0.0 
4  0.185185   0.1 
5  0.000000   0.0 
6  0.000000   0.0 
7  0.000000   0.0 
8  0.148148   0.1 
9  0.185185   0.1 
10  0.000000   0.0 

тайминги

In [11]: 
%timeit np.where(np.abs(df.second_step) > 2, np.sign(df.second_step) * 2, df.second_step) 

10 loops, best of 3: 28.9 ms per loop 

In [12]:  
%timeit df['second_step'].clip(-.1,.1) 

10 loops, best of 3: 51.2 ms per loop 

Это почти вдвое медленнее, чем чистый nump y, что неудивительно, поскольку методы pandas выполняют дополнительные функции, такие как проверка типов и границ

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