Comment transformer une base de données en une série de listes?

j'ai eu à faire plusieurs fois et je suis toujours frustré. J'ai un dataframe:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'], ['A', 'B', 'C', 'D'])

print df

   A  B  C  D
a  1  2  3  4
b  5  6  7  8

je veux tourner df en:

pd.Series([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'])

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

j'ai essayé

df.apply(list, axis=1)

Qui vient de me le de la même df

Quelle est une façon pratique et efficace de le faire?

20
demandé sur jezrael 2016-08-02 09:29:48

3 réponses

Vous pouvez d'abord convertir DataFramenumpy array par values, puis convertir en liste et créer la dernière nouvelle Series index df si besoin solution plus rapide:

print (pd.Series(df.values.tolist(), index=df.index))
a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

Timings avec de petites DataFrame:

In [76]: %timeit (pd.Series(df.values.tolist(), index=df.index))
1000 loops, best of 3: 295 µs per loop

In [77]: %timeit pd.Series(df.T.to_dict('list'))
1000 loops, best of 3: 685 µs per loop

In [78]: %timeit df.T.apply(tuple).apply(list)
1000 loops, best of 3: 958 µs per loop

et avec de gros:

from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                  pd.MultiIndex.from_product([letters, letters]),
                  letters)

In [71]: %timeit (pd.Series(df.values.tolist(), index=df.index))
100 loops, best of 3: 2.06 ms per loop

In [72]: %timeit pd.Series(df.T.to_dict('list'))
1 loop, best of 3: 203 ms per loop

In [73]: %timeit df.T.apply(tuple).apply(list)
1 loop, best of 3: 506 ms per loop
20
répondu jezrael 2016-08-02 06:49:11

pandas s'efforce de rendre les images de données pratiques. En tant que tel, il interprète les listes et les tableaux comme des choses que vous voudriez diviser en colonnes. Je ne vais pas me plaindre, c'est presque toujours utile.

j'ai fait cela de deux façons.

Option 1:

# Only works with a non MultiIndex
# and its slow, so don't use it
df.T.apply(tuple).apply(list)

Option 2:

pd.Series(df.T.to_dict('list'))

les Deux de vous donner:

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

Cependant Option 2 échelles mieux.


Calendrier

donné df

enter image description here

beaucoup plus grand df

from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                  pd.MultiIndex.from_product([letters, letters]),
                  letters)

Résultats df.T.apply(tuple).apply(list) sont erronés parce que cette solution ne fonctionne pas sur un MultiIndex.

enter image description here

8
répondu piRSquared 2016-08-02 07:09:37

Dataframe à la liste de conversion

List_name =df_name.values.tolist()
0
répondu Sayali Sonawane 2016-08-02 08:51:37