2013-10-01 3 views
1

Я искал способ выполнить операции с столбцами (например, в excel), используя pandas без повторения каждой строки окружения. Я имею дело с потенциально очень большими объектами pd.DataFrame и хотел бы использовать функции там, где это возможно.
я использовал функцию отображения лямбды делать подобные вещи в прошлом:python pandas .map double variable lambda

df['a'] = df['a'].map(lambda x: int(str(int(x))[:-1])) #remove the last digit in column 'a' 

было бы возможен отобразить что-то вроде следующего лямбда-функции для имитации функции SQL Coalesce?

lambda x,y: x if x else y 

где х и у являются обе колонки (аналогично первому примеру), и я хотел бы использовать лямбда, чтобы создать третий объект столбца.

+0

Что делать вам е xpect аргумент 'y'? Весь смысл «карты» заключается в том, что он передает каждое значение, один за другим, в вашу функцию. – abarnert

+2

Метод 'where'' Series' и 'DataFrame' выполняет векторизованные вычисления типа' x if x else y'. –

+0

Удивительная благодарность! Предполагая, что мне нужна функция многоколоночных? – DrBailey

ответ

3

Похоже, что вы ищете метод DataFrame.apply(). Метод apply очень общий способ применить функцию через либо столбцы или строки в DataFrame:

In [1]: df = DataFrame(randn(10, 3)) 

In [2]: df 
Out[2]: 
     0  1  2 
0 2.848 -1.536 0.234 
1 -0.652 -1.169 0.101 
2 0.957 -0.642 0.961 
3 1.722 -2.552 -0.517 
4 -0.258 1.810 1.332 
5 0.362 -1.215 0.768 
6 0.949 -0.384 -0.802 
7 0.782 -1.140 -2.217 
8 -0.410 0.882 -0.366 
9 0.240 0.632 -1.374 

In [3]: def standardize(x): 
    ...:  y = x - x.mean() 
    ...:  sd = x.std() 
    ...:  return y/sd 
    ...: 

In [4]: df.apply(standardize) 
Out[4]: 
     0  1  2 
0 2.074 -0.773 0.384 
1 -1.234 -0.490 0.263 
2 0.286 -0.085 1.047 
3 1.009 -1.555 -0.300 
4 -0.862 1.801 1.385 
5 -0.276 -0.526 0.871 
6 0.279 0.113 -0.559 
7 0.121 -0.468 -1.848 
8 -1.005 1.087 -0.162 
9 -0.391 0.895 -1.081 

In [5]: df.apply(standardize).mean() 
Out[5]: 
0 8.327e-17 
1 2.220e-17 
2 2.220e-17 
dtype: float64 

In [6]: df.apply(standardize).std() 
Out[6]: 
0 1 
1 1 
2 1 
dtype: float64 

По умолчанию он применяет функцию к столбцам, но при пропускании axis=1 вы можете применить функцию к каждому ряд:

In [8]: df.apply(standardize, axis=1).mean(1) 
Out[8]: 
0 -1.850e-17 
1 7.401e-17 
2 -3.701e-17 
3 -2.544e-17 
4 9.252e-17 
5 3.701e-17 
6 -3.701e-17 
7 -1.110e-16 
8 -3.701e-17 
9 0.000e+00 
dtype: float64 

Что касается x if x else y вычислений типа, используйте DataFrame.where():

In [16]: df = DataFrame(randint(6, size=(10, 3))) 

In [17]: df 
Out[17]: 
    0 1 2 
0 2 1 4 
1 2 4 0 
2 4 4 4 
3 4 3 2 
4 2 4 3 
5 1 1 3 
6 2 0 2 
7 1 4 4 
8 2 4 5 
9 2 1 2 

In [19]: df.where(df, nan) 
Out[19]: 
    0 1 2 
0 2 1 4 
1 2 4 NaN 
2 4 4 4 
3 4 3 2 
4 2 4 3 
5 1 1 3 
6 2 NaN 2 
7 1 4 4 
8 2 4 5 
9 2 1 2