Puede usar el DataFrame
constructor lists
creado por to_list
:
import pandas as pd
d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
teams
0 [SF, NYG]
1 [SF, NYG]
2 [SF, NYG]
3 [SF, NYG]
4 [SF, NYG]
5 [SF, NYG]
6 [SF, NYG]
df2[['team1','team2']] = pd.DataFrame(df2.teams.tolist(), index= df2.index)
print (df2)
teams team1 team2
0 [SF, NYG] SF NYG
1 [SF, NYG] SF NYG
2 [SF, NYG] SF NYG
3 [SF, NYG] SF NYG
4 [SF, NYG] SF NYG
5 [SF, NYG] SF NYG
6 [SF, NYG] SF NYG
Y para nuevo DataFrame
:
df3 = pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
print (df3)
team1 team2
0 SF NYG
1 SF NYG
2 SF NYG
3 SF NYG
4 SF NYG
5 SF NYG
6 SF NYG
La solución con apply(pd.Series)
es muy lenta:
#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)
In [121]: %timeit df2['teams'].apply(pd.Series)
1.79 s ± 52.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [122]: %timeit pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
1.63 ms ± 54.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
apply()
puede ser más lento, pero es el método de acceso cuando la cadena de entrada y los valores no son iguales en las filas de la serie original.Solución mucho más simple:
Rendimientos,
Si desea dividir una columna de cadenas delimitadas en lugar de listas, podría hacer lo mismo:
fuente
df["teams"].str.split('<delim>', expand=True)
ya devuelve un DataFrame, por lo que probablemente sería más simple cambiar el nombre de las columnas.Esta solución conserva el índice del
df2
DataFrame, a diferencia de cualquier solución que usetolist()
:Aquí está el resultado:
fuente
apply
que puedes hacer en pandas. Debe evitar este método y usar la respuesta aceptada. En los tiempos de la respuesta principal, este método es aproximadamente1400 x
más lento @rajanapply
método funciona de manera más confiable para expandir matrices grandes (más de 1000 elementos) en grandes conjuntos de datos. Eltolist()
método eliminó mi proceso cuando el conjunto de datos superó las 500k filas.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
realmente mucho más complicado?Parece que hay una forma sintácticamente más simple y, por lo tanto, más fácil de recordar, a diferencia de las soluciones propuestas. Supongo que la columna se llama 'meta' en un marco de datos df:
fuente
str.split()
. Esto fue mucho más simple y tiene la ventaja si no conoce la cantidad de elementos en su lista.Según las respuestas anteriores, aquí hay otra solución que devuelve el mismo resultado que df2.teams.apply (pd.Series) con un tiempo de ejecución mucho más rápido:
Tiempos:
fuente
Las soluciones anteriores no funcionaron para mí ya que tengo
nan
observaciones en midataframe
. En mi casodf2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
produce:Resuelvo esto usando la comprensión de la lista. Aquí el ejemplo replicable:
salida:
resolviendo con la comprensión de la lista:
rendimientos:
fuente
lista de comprensión
Implementación simple con comprensión de listas (mi favorita)
sincronización en la salida:
salida:
fuente
Aquí hay otra solución usando
df.transform
ydf.set_index
:fuente