Est-il possible d'appeler la fonction apply sur plusieurs colonnes dans pandas et si oui, comment on fait ça .. par exemple,

 df['Duration'] = df['Hours', 'Mins', 'Secs'].apply(lambda x,y,z: timedelta(hours=x, minutes=y, seconds=z))

Voici à quoi devrait ressembler la sortie attendue une fois que tout est réuni

Je vous remercie.

0
Blank 16 avril 2018 à 20:49

3 réponses

Meilleure réponse

Vous devez utiliser:

df['Duration'] = pd.to_timedelta(df.Hours*3600 + df.Mins*60 + df.Secs, unit='s')

Lorsque vous utilisez appliquer sur un DataFrame avec axis=1, c'est un calcul de ligne, donc généralement cette syntaxe est logique:

df['Duration'] = df.apply(lambda row: pd.Timedelta(hours=row.Hours, minutes=row.Mins, 
    seconds=row.Secs), axis=1)

Quelques horaires

import pandas as pd
import numpy as np
df = pd.DataFrame({'Hours': np.tile([1,2,3,4],50),
                  'Mins':  np.tile([10,20,30,40],50),
                  'Secs': np.tile([11,21,31,41],50)})

%timeit pd.to_timedelta(df.Hours*3600 + df.Mins*60 + df.Secs, unit='s')
#432 µs ± 5.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.apply(lambda row: pd.Timedelta(hours=row.Hours, minutes=row.Mins, seconds=row.Secs), axis=1)
#12 ms ± 67.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Comme toujours, postuler devrait être un dernier recours.

1
ALollz 16 avril 2018 à 18:10

Cela pourrait aider.

import pandas as pd
import datetime as DT
df = pd.DataFrame({"Hours": [1], "Mins": [2], "Secs": [10]})
df = df.astype(int)

df['Duration'] = df[['Hours', 'Mins', 'Secs']].apply(lambda x: DT.timedelta(hours=x[0], minutes=x[1], seconds=x[2]), axis=1)

print(df)
print(df["Duration"])

Sortie:

   Hours  Mins  Secs  Duration
0      1     2    10  01:02:10

0   01:02:10
dtype: timedelta64[ns]
0
Rakesh 16 avril 2018 à 18:00

Utilisez apply sur la trame de données avec axis=1 https://pandas.pydata.org/pandas- docs / stable / généré / pandas.DataFrame.apply.html

triangles = [{ 'base': 20, 'height': 9 }, { 'base': 10, 'height': 7 }, { 'base': 40, 'height': 4 }]

triangles_df = pd.DataFrame(triangles)

def calculate_area(row): return row['base'] * row['height'] * 0.5

triangles_df.apply(calculate_area, axis=1)

Bonne chance!

0
Brayden 16 avril 2018 à 17:56