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.