Vous pouvez utiliser le DataFrame
constructeur avec lists
créé par 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
Et pour nouveau 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 solution avec apply(pd.Series)
est très lente:
#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()
peut être plus lent, mais c'est la méthode idéale lorsque la chaîne d'entrée et les valeurs ne sont pas égales sur les lignes de la série d'origine!Solution beaucoup plus simple:
Rendements,
Si vous souhaitez diviser une colonne de chaînes délimitées plutôt que de listes, vous pouvez procéder de la même manière:
la source
df["teams"].str.split('<delim>', expand=True)
renvoie déjà un DataFrame, il serait donc probablement plus simple de simplement renommer les colonnes.Cette solution préserve l'index du
df2
DataFrame, contrairement à toute solution qui utilisetolist()
:Voici le résultat:
la source
apply
vous puissiez faire chez les pandas. Vous devez éviter cette méthode et utiliser la réponse acceptée. Dans les délais de la première réponse, cette méthode est environ1400 x
plus lente @rajanapply
méthode fonctionne de manière plus fiable pour étendre de grandes baies (plus de 1000 éléments) sur de grands ensembles de données. Latolist()
méthode a tué mon processus lorsque l'ensemble de données dépassait 500 000 lignes.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
vraiment beaucoup plus compliqué?Il semble y avoir une manière syntaxiquement plus simple, et donc plus facile à retenir, par opposition aux solutions proposées. Je suppose que la colonne est appelée `` meta '' dans un dataframe df:
la source
str.split()
. C'était beaucoup plus simple et a l'avantage si vous ne connaissez pas le nombre d'articles dans votre liste.Sur la base des réponses précédentes, voici une autre solution qui renvoie le même résultat que df2.teams.apply (pd.Series) avec un temps d'exécution beaucoup plus rapide:
Horaires:
la source
Les solutions ci-dessus n'ont pas fonctionné pour moi car j'ai des
nan
observations dans mondataframe
. Dans mon cas,df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
cède:Je résous cela en utilisant la compréhension de liste. Voici l'exemple réplicable:
production:
résolution avec compréhension de liste:
donne:
la source
compréhension de liste
mise en œuvre simple avec compréhension de liste (mon préféré)
synchronisation en sortie:
production:
la source
Voici une autre solution utilisant
df.transform
etdf.set_index
:la source