Как применить функцию только к некоторым столбцам датафрейма?

Рейтинг: 1Ответов: 3Опубликовано: 31.05.2023
import pandas as pd
    
def pr(income):
    if random.random() > 0,8:
        return [int(round(income[0]*income[1] , -1 )) , income[0]+income[1]]
    else:
        return [income[0] , income[1]]
    
    
data[['Price1','Price2']] = data[['Price1','Price2']].apply(pr, axis=1)

Во фрейме data много столбцов, подскажите, пожалуйста, как мне изменить процедурой только два из них?

Ответы

▲ 1

используйте список в локаторе:

import pandas as pd
import random

def pr(income):
    if random.random() > 0.8:
        res = [int(round(income["a"]*income["c"] , -1 )) , income["a"]+income["c"]]
        return pd.Series(res, index=income.index)
    else:
        return income

df = pd.DataFrame({"a":[1,2,3,4], "b":[11,22,33,44], "c":[111,222,333,444]})
print(df)
   a   b    c
0  1  11  111
1  2  22  222
2  3  33  333
3  4  44  444
df.loc[:,["a", "c"]] = df.loc[:,["a", "c"]].apply(pr, axis=1)
print(df)
      a   b    c
0     1  11  111
1   440  22  224
2     3  33  333
3  1780  44  448

▲ 1
    import pandas as pd
    
def pr(income):
    if random.random() > 0,8:
        return pd.Series([int(round(income[0]*income[1] , -1 )) , income[0]+income[1]])
    else:
        return pd.Series([income[0] , income[1]])
    
    
data[['Price1','Price2']] = data[['Price1','Price2']].apply(pr, axis=1)

Спасибо всем, разобрался в итоге сам

▲ 0

Не совсем понял, применять к столбцам или ячейкам, в вопросе одно, в тексте вопроса другое, но если для столбцов, то можно выполнять .apply() в цикле for:

for i in ['Price1','Price2']:
    data[i] = data[i].apply(pr, axis=1)

В список для цикла for закидываем значения всех столбцов, которые нужно изменить.