usar sumar recorrer promedio data como columnas python list pandas dataframe series

python - sumar - recorrer data frame pandas



¿Cómo convierto un marco de datos en una serie de listas? (3)

He tenido que hacer esto varias veces y siempre estoy frustrado. Tengo un marco de datos:

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

Quiero convertir 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

He intentado

df.apply(list, axis=1)

Lo que me devuelve el mismo df

¿Qué es una manera conveniente / efectiva de hacer esto?


Conversión del marco de datos a la lista

List_name =df_name.values.tolist()


Primero puede convertir DataFrame en numpy array por values , luego convertir en lista y crear una nueva Series con índice desde df si necesita una solución más rápida:

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

Tiempos con pequeño 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

y con grandes

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


pandas intenta realmente hacer que los marcos de datos sean convenientes. Como tal, interpreta las listas y matrices como cosas que querría dividir en columnas. No me voy a quejar, esto casi siempre es útil.

He hecho esto de una de las dos maneras.

Opción 1 :

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

Opción 2 :

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

Ambos te dan:

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

Sin embargo, la Opción 2 se escala mejor.

Sincronización

dado df

mucho mas grande 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)

Los resultados para df.T.apply(tuple).apply(list) son erróneos porque esa solución no funciona con un MultiIndex.