Supposons que nous ayons les séries de pandas suivantes résultant d'une fonction d'application appliquée sur une trame de données après groupby.

<class 'pandas.core.series.Series'>
0        (1, 0, [0.2, 0.2, 0.2], [0.2, 0.2, 0.2])
1     (2, 1000, [0.6, 0.7, 0.5], [0.1, 0.3, 0.1])
2        (1, 0, [0.4, 0.4, 0.4], [0.4, 0.4, 0.4])
3        (1, 0, [0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
4    (3, 14000, [0.8, 0.8, 0.8], [0.6, 0.6, 0.6])
dtype: object

Pouvons-nous convertir cela en une trame de données lorsque les sigList = ['sig1', 'sig2', 'sig3'] sont donnés?

Length Distance sig1Max sig2Max sig3Max sig1Min sig2Min sig3Min
1 0 0.2 0.2 0.2 0.2 0.2 0.2                  
2 1000 0.6 0.7 0.5 0.1 0.3 0.1
1 0 0.4 0.4 0.4 0.4 0.4 0.4
1 0 0.5 0.5 0.5 0.5 0.5 0.5
3 14000 0.8 0.8 0.8 0.6 0.6 0.6

Merci d'avance

3
burcak 21 nov. 2018 à 01:32

3 réponses

Meilleure réponse

Faites-le à l'ancienne (et rapidement), en utilisant une liste de compréhension:

columns = ("Length Distance sig1Max sig2Max" 
           "sig3Max sig1Min sig2Min sig3Min").split()
df = pd.DataFrame([[a, b, *c, *d] for a,b,c,d in series.values], columns=columns)
print(df)
   Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
0       1         0      0.2      0.2      0.2      0.2      0.2      0.2
1       2      1000      0.6      0.7      0.5      0.1      0.3      0.1
2       1         0      0.4      0.4      0.4      0.4      0.4      0.4
3       1         0      0.5      0.5      0.5      0.5      0.5      0.5
4       3     14000      0.8      0.8      0.8      0.6      0.6      0.6

Ou, peut-être vouliez-vous dire, faites-le un peu plus dynamiquement

sigList = ['sig1', 'sig2', 'sig3']

columns = ['Length', 'Distance']
columns.extend(f'{s}{lbl}' for lbl in ('Max', 'Min') for s in sigList )

df = pd.DataFrame([[a,b,*c,*d] for a,b,c,d in series.values], columns=columns)
print(df)
   Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
0       1         0      0.2      0.2      0.2      0.2      0.2      0.2
1       2      1000      0.6      0.7      0.5      0.1      0.3      0.1
2       1         0      0.4      0.4      0.4      0.4      0.4      0.4
3       1         0      0.5      0.5      0.5      0.5      0.5      0.5
4       3     14000      0.8      0.8      0.8      0.6      0.6      0.6
4
cs95 21 nov. 2018 à 03:52

Vous pouvez vérifier

newdf=pd.DataFrame(s.tolist())
newdf=pd.concat([newdf[[0,1]],pd.DataFrame(newdf[2].tolist()),pd.DataFrame(newdf[3].tolist())],1)
newdf.columns = [
    "Length", "Distance", "sig1Max", "sig2Max", "sig3Max", "sig1Min", "sig2Min", "sig3Min"
]
newdf
Out[163]: 
   Length  Distance  sig1Max   ...     sig1Min  sig2Min  sig3Min
0       1         0      0.2   ...         0.2      0.2      0.2
1       2      1000      0.6   ...         0.1      0.3      0.1
2       1         0      0.4   ...         0.4      0.4      0.4
3       1         0      0.5   ...         0.5      0.5      0.5
4       3     14000      0.8   ...         0.6      0.6      0.6
[5 rows x 8 columns]
1
YOBEN_S 20 nov. 2018 à 23:17

Vous pouvez aplatir chaque élément, puis convertir chacun en une série elle-même. La conversion de chaque élément en une série transforme la série principale (s dans l'exemple ci-dessous) en un DataFrame. Ensuite, définissez simplement les noms de colonne comme vous le souhaitez.

Par exemple:

import pandas as pd

# load in your data
s = pd.Series([
    (1, 0, [0.2, 0.2, 0.2], [0.2, 0.2, 0.2]),
    (2, 1000, [0.6, 0.7, 0.5], [0.1, 0.3, 0.1]),
    (1, 0, [0.4, 0.4, 0.4], [0.4, 0.4, 0.4]),
    (1, 0, [0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
    (3, 14000, [0.8, 0.8, 0.8], [0.6, 0.6, 0.6]),
])

def flatten(x):
    # note this is not very robust, but works for this case
    return [x[0], x[1], *x[2], *x[3]]

df = s.apply(flatten).apply(pd.Series)
df.columns = [
    "Length", "Distance", "sig1Max", "sig2Max", "sig3Max", "sig1Min", "sig2Min", "sig3Min"
]

Vous avez alors df comme:

   Length  Distance  sig1Max  sig2Max  sig3Max  sig1Min  sig2Min  sig3Min
0     1.0       0.0      0.2      0.2      0.2      0.2      0.2      0.2
1     2.0    1000.0      0.6      0.7      0.5      0.1      0.3      0.1
2     1.0       0.0      0.4      0.4      0.4      0.4      0.4      0.4
3     1.0       0.0      0.5      0.5      0.5      0.5      0.5      0.5
4     3.0   14000.0      0.8      0.8      0.8      0.6      0.6      0.6
0
Henry Woody 20 nov. 2018 à 22:41