Dans R, je peux appliquer une transformation logarithmique (ou racine carrée, etc.) à toutes les colonnes numériques d'un bloc de données, en utilisant:

logdf <- log10(df)

Y a-t-il quelque chose d'équivalent en Python / Pandas? Je vois qu'il y a une fonction "transformer" et une fonction (R-like) "appliquer", mais je n'ai pas pu comprendre comment les utiliser dans ce cas.

Merci pour tout conseil ou suggestion.

6
maurobio 27 janv. 2019 à 17:08

4 réponses

Meilleure réponse

Supposons que vous ayez une trame de données nommée df

Vous pouvez d'abord faire une liste des types numériques possibles, puis faire une boucle

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
for c in [c for c in df.columns if df[c].dtype in numerics]:
    df[c] = np.log10(df[c])

Ou, une solution à une ligne avec l'opérateur lambda et np.dtype.kind

numeric_df = df.apply(lambda x: np.log10(x) if np.issubdtype(x.dtype, np.number) else x)
3
Rex Low 27 janv. 2019 à 15:28

Si vous vous souciez de la vitesse:

df = pd.DataFrame({'A': list('abc')*1000000, 'B': [10, 20,200]*1000000,
                  'C': [0.1,0.2,0.3]*1000000})
df.head()

%timeit df.apply(lambda x: np.log10(x) if np.issubdtype(x.dtype, np.number) else x)
#1 loop, best of 3: 539 ms per loop

%%timeit
log10_df = pd.concat([df.select_dtypes(exclude=np.number),
                      df.select_dtypes(include=np.number).apply(np.log10)],
                      axis=1)
#loop, best of 3: 315 ms per loop

%%timeit
for c in df.select_dtypes(include = [np.number]).columns:
    df[c] = np.log10(df[c].values)
#1 loop, best of 3: 113 ms per loop
1
astro123 27 janv. 2019 à 20:57

Si la plupart des colonnes sont numériques, il peut être judicieux de simplement try et de sauter la colonne si cela ne fonctionne pas:

for column in df.columns:
    try:
        df[column] = np.log10(df[column])
    except (ValueError, AttributeError):
        pass

Si vous le souhaitez, vous pouvez l'envelopper dans une fonction, bien sûr.

3
Graipher 27 janv. 2019 à 14:15

Vous pouvez utiliser select_dtypes et < un href = "https://docs.scipy.org/doc/numpy/reference/generated/numpy.log10.html" rel = "nofollow noreferrer"> numpy.log10 :

import numpy as np
for c in df.select_dtype(include = [np.number]).columns:
    df[c] = np.log10(df[c])

Le select_dtypes sélectionne les colonnes des types de données qui sont passés à son paramètre include. np.number comprend tous les types de données numériques.

numpy.log10 renvoie le logarithme en base 10 de l'entrée, élément par élément

2
Mohit Motwani 27 janv. 2019 à 14:37