2015-10-12 3 views
2

В принципе мне интересно, если есть более «Pandathonic» способ выражения этого:Есть ли способ «применить» функцию к одному столбцу кадра данных, оставив остальные столбцы исправленными?

df.apply(lambda col: myfunc(col) if col == "mycol" else col) 

Что-то вроде

df.apply(myfunc, subset = ["mycol"]) 

это вид, что я имею в виду.

Причина заключается в том, что я стараюсь не делать этого:

df['mycol']=myfunc(df['mycol']) 

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

+0

'DF [«»] Mycol .apply (lambda x: myfunc (x)) '? – Zero

+0

Нет, я хочу вернуть весь файл данных – maxymoo

+0

Если 'apply' не выполняется' inplace', вам все равно нужно выполнить задание, так в чем же разница? – hellpanderrr

ответ

2

В панде 0.16 или более поздняя версия, вы можете использовать DataFrame.assign, который возвращает новый DataFrame с любым заданием вы сказать, что это нужно сделать, но не изменяет оригинал:

>>> d = pandas.DataFrame({"A": [1, 2, 3], "B": [8, 88, 888]}) 
>>> d 
    A B 
0 1 8 
1 2 88 
2 3 888 
>>> d.assign(A=d.A**2) 
    A B 
0 1 8 
1 4 88 
2 9 888 
>>> d 
    A B 
0 1 8 
1 2 88 
2 3 888 
+0

Это интересно (не знал об этом методе), хотя это будет неудобно быстро с конвейерами вместе с несколькими функциями – maxymoo

+0

@maxymoo странно, что вы говорите, что он получит неловко; точка цепочки является довольно интуитивной и естественной (в отличие от операций на месте) – Jeff

+0

@Jeff. Я хочу сказать, что если я хочу составлять функции 'f1',' f2' и 'f3', синтаксис будет' d .assign (A = f3 (d.assign (A = f2 (d.assign (A = f1)))) '; согласитесь, что это лучше, чем на месте, но я бы сказал, что это менее читаемо, чем" форвардная труба ", используя что-то вроде' apply' – maxymoo