Как работать с Dataframe со многими столбцами и оператором if - PullRequest
1 голос
/ 20 июня 2020

Вот моя проблема

Ниже вы найдете образец моего DataFrame:

df = pd.DataFrame({'Date':['01/03/2000','01/04/2000','01/05/2000','01/06/2000','01/07/2000','01/08/2000'],
                      'Paul_Score':[3,10,22,32,20,40],
                       'John_Score':[8,42,10,57,3,70]

                      })

df['Date']= pd.to_datetime(df['Date'])

df = df.set_index('Date')

И я начал работать над al oop с таким выражением If:

def test(selection,symbol):
    df_end = (selection*0)
    rolling_mean = selection.rolling(2).mean().fillna(0)
    calendar = pd.Series(df_end.index)

    for date in calendar:
        module=1/selection.loc[date,symbol]
        if  selection.loc[date,symbol] > rolling_mean.loc[date,symbol]:
            df_end.loc[date,symbol] = module

        else:
            df_end.loc[date,symbol]=0


    return df_end

Тогда:

test(df,'John_Score')

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

РЕДАКТИРОВАТЬ:

Это то, что у меня есть с test(df,'John_Score'):

       Paul_Score John_Score
Date        
2000-01-03  0   0.125000
2000-01-04  0   0.023810
2000-01-05  0   0.000000
2000-01-06  0   0.017544
2000-01-07  0   0.000000
2000-01-08  0   0.014286

И это то, что у меня с test(df,'Paul_Score'):

           Paul_Score John_Score
Date        
2000-01-03  0.333333    0
2000-01-04  0.100000    0
2000-01-05  0.045455    0
2000-01-06  0.031250    0
2000-01-07  0.000000    0
2000-01-08  0.025000    0

И я бы хотел что-то вроде этого:

          Paul_Score John_Score
Date        
2000-01-03  0.333333    0.125000
2000-01-04  0.100000    0.023810
2000-01-05  0.045455    0.000000
2000-01-06  0.031250    0.017544
2000-01-07  0.000000    0.000000
2000-01-08  0.025000    0.014286

Моя цель - проверять df каждый день в каждом столбце, и если значение больше, чем значение его скользящего среднего 2 дня, мы вычисляем 1 / значение df, если оно истинно, и 0, если нет.

Это может быть более простой способ, но я пытаюсь улучшить свои навыки кодирования с помощью оператора for / if, и я обнаружил, что у меня возникают трудности с выполнением вычислений на Фреймы данных с множеством столбцов

Если у вас есть идеи, добро пожаловать

1 Ответ

1 голос
/ 20 июня 2020

Возможно, этот код сработает:

import pandas as pd

df = pd.DataFrame({'Date':['01/03/2000','01/04/2000','01/05/2000','01/06/2000','01/07/2000','01/08/2000'],
                      'Paul_Score':[3,10,22,32,20,40],
                       'John_Score':[8,42,10,57,3,70]

                      })

df['Date']= pd.to_datetime(df['Date'])

df = df.set_index('Date')

def test(selection,symbol):
    df_end = (selection*0)
    rolling_mean = selection.rolling(2).mean().fillna(0)
    calendar = pd.Series(df_end.index)

    for date in calendar:
        for cols in symbol:
            module=1/selection.loc[date,cols]
            if  selection.loc[date,cols] > rolling_mean.loc[date,cols]:
                df_end.loc[date,cols] = module

            else:
                df_end.loc[date,cols]=0


    return df_end

test(df,['Paul_Score', 'John_Score'])

Вывод:

            Paul_Score  John_Score
Date                              
2000-01-03    0.333333    0.125000
2000-01-04    0.100000    0.023810
2000-01-05    0.045455    0.000000
2000-01-06    0.031250    0.017544
2000-01-07    0.000000    0.000000
2000-01-08    0.025000    0.014286
...