2017-08-19 4 views
1

Existe-t-il une pile SFrame équivalente dans les données pandas? La propre pile de Pandas ne fonctionne qu'avec des niveaux alors que je cherche à étendre une seule colonne au même niveau que d'autres qui contient des listes.Empiler un tableau de listes dans pandas/SFrame stack equivalent dans Pandas

Entrée dataframe: Il y a quelques autres colonnes comme utilisateur dans dataframe réelle

+-------+------------------+ 
| user |  friends  | 
+-------+------------------+ 
| 1 |  [2, 3, 4] | 
| 2 |  [5, 6]  | 
| 3 | [4, 5, 10, None] | 
+----- -+------------------+ 

Sortie dataframe: Il y a quelques autres colonnes comme utilisateur dans dataframe réelle, qui doit se répétées de la même

+------+--------+ 
| user | friend | 
+------+--------+ 
| 1 | 2  | 
| 1 | 3  | 
| 1 | 4  | 
| 2 | 5  | 
| 2 | 6  | 
| 3 | 4  | 
| 3 | 5  | 
| 3 | 10 | 
| 3 | None | 
+------+--------+ 
+0

Si vous pouvez montrer votre entrée, ainsi que votre résultat attendu. nous pouvons aider. Pour l'instant, ce n'est pas clair ce que vous voulez. –

+0

Vous pouvez donner un exemple pratique de votre cadre Pandas et ce que vous voulez faire avec (et peut-être ce que vous avez déjà essayé). Tout le monde ne sait pas ce qu'est une pile SFrame. – Evert

+0

Yup. juste réalisé. Mettez dans un exemple d'entrée df et de sortie df requis. –

Répondre

1
pd.DataFrame.from_items([ 
    ('user', df.user.values.repeat(df.friends.str.len())), 
    ('friends', np.concatenate(df.friends)) 
]) 

    user friends 
0  1  2 
1  1  3 
2  1  4 
3  2  5 
4  2  6 
5  3  4 
6  3  5 
7  3  10 
8  3 None 
+0

Merci! Cela fonctionne parfaitement. J'ai plusieurs colonnes dans ma DF. Dois-je simplement utiliser 'for loop' pour créer ces éléments, puis passer le constructeur de dataframe? –

1

Vous pourrait le faire

data['friend'].apply(pd.Series).stack().reset_index(level=1, drop=True).to_frame('friend').join(data[['user']], how='left') 

Ceci fonctionnerait également si vous aviez plus de colonne ne qui était similaire à la colonne « utilisateur » dire quelque chose comme « autre colonne », alors vous suffit de faire

data['friend'].apply(pd.Series).stack().reset_index(level=1, drop=True).to_frame('friend').join(data[['user',"other column"]], how='left') 
+0

Merci! Cela fonctionne très bien. Cependant, il enlève la valeur 'None' que je dois retenir. J'aurais préféré que ce soit la bonne réponse sinon, puisque ceci est facilement extensible à plusieurs colonnes et utilise aussi la fonction 'stack' des pandas. –