web-dev-qa-db-fra.com

Utilisation de map () pour les colonnes dans une trame de données pandas

J'ai des colonnes dans mon dataframe pour lesquelles je veux juste garder la partie date et supprimer la partie temps. J'ai fait une liste de ces colonnes:

list_of_cols_to_change = ['col1','col2','col3','col4']

J'ai écrit une fonction pour ce faire. Il prend une liste de colonnes et applique dt.date à chaque colonne de la liste.

def datefunc(x):
    for column in x:
        df[column] = df[column].dt.date

J'appelle ensuite cette fonction en passant la liste en paramètre:

datefunc(list_of_cols_to_change )

Je veux accomplir cela en utilisant quelque chose comme map (). Fondamentalement, utilisez une fonction qui prend une colonne comme paramètre et y apporte des modifications. Je veux ensuite utiliser map () pour appliquer cette fonction à la liste des colonnes que j'ai. Quelque chose comme ça:

def datefunc_new(column):
    df[column] = df[column].dt.date

map(datefunc_new,list_of_cols_to_change)

Cela ne fonctionne cependant pas. Comment puis-je faire fonctionner cela?

12

Le plus simple est d'utiliser la fonction lambda avec apply :

df = pd.DataFrame({'col1':pd.date_range('2015-01-02 15:00:07', periods=3),
                   'col2':pd.date_range('2015-05-02 15:00:07', periods=3),
                   'col3':pd.date_range('2015-04-02 15:00:07', periods=3),
                   'col4':pd.date_range('2015-09-02 15:00:07', periods=3),
                   'col5':[5,3,6],
                   'col6':[7,4,3]})

print (df)
                 col1                col2                col3  \
0 2015-01-02 15:00:07 2015-05-02 15:00:07 2015-04-02 15:00:07   
1 2015-01-03 15:00:07 2015-05-03 15:00:07 2015-04-03 15:00:07   
2 2015-01-04 15:00:07 2015-05-04 15:00:07 2015-04-04 15:00:07   

                 col4  col5  col6  
0 2015-09-02 15:00:07     5     7  
1 2015-09-03 15:00:07     3     4  
2 2015-09-04 15:00:07     6     3  

list_of_cols_to_change = ['col1','col2','col3','col4']
df[list_of_cols_to_change] = df[list_of_cols_to_change].apply(lambda x: x.dt.date)
print (df)
         col1        col2        col3        col4  col5  col6
0  2015-01-02  2015-05-02  2015-04-02  2015-09-02     5     7
1  2015-01-03  2015-05-03  2015-04-03  2015-09-03     3     4
2  2015-01-04  2015-05-04  2015-04-04  2015-09-04     6     3
14
jezrael

Je pense que vous avez déjà la solution, ajoutez simplement column comme paramètre à votre fonction datefunc_new:

def datefunc_new(column):
    df[column] = df[column].dt.date

map(datefunc_new, list_of_cols_to_change)

Vous pouvez également utiliser un code similaire à pandas pour votre exemple spécifique:

def to_date(series):
    return series.dt.date

df[list_of_cols_to_change] = df[list_of_cols_to_change].apply(to_date)
3
pansen