2017-09-26 1 views
3

J'ai une liste comme suit:Créer une trame de données de pandas géants à partir d'une des listes imbriquées de longueurs inégales

aa = ['aa1', 'aa2', 'aa3', 'aa4', 'aa5'] 
bb = ['bb1', 'bb2', 'bb3', 'bb4'] 
cc = ['cc1', 'cc2', 'cc3'] 

qui est ensuite créé dans une liste imbriquée:

nest = [aa, bb, cc] 

Je veux créer un dataframe comme suit:

aa bb cc 
aa1 bb1 cc1 
aa2 bb2 cc2 
aa3 bb3 cc3 
aa4 bb4 nan 
aa5 nan nan 

J'ai essayé:

pd.DataFrame(nest, columns=['aa', 'bb', cc']) 

mais les résultats est telle que, chaque liste est écrit sous la forme d'une rangée (par opposition à une colonne)

+0

'(itertools.izip_longest (aa, bb, cc))' –

Répondre

3

La fonction zip_longest de itertools Est-ce:

>>> import itertools, pandas 
>>> pandas.DataFrame((_ for _ in itertools.zip_longest(*nest)), columns=['aa', 'bb', 'cc']) 
    aa bb cc 
0 aa1 bb1 cc1 
1 aa2 bb2 cc2 
2 aa3 bb3 cc3 
3 aa4 bb4 None 
4 aa5 None None 

Si vous avez une ancienne version de pandas géants vous devrez peut-être envelopper zip_longest dans un constructeur de liste. Sur les anciens Python, vous devrez peut-être appeler izip_longest au lieu de zip_longest.

+0

Je n'attendais que vous pour poster ceci (-: – piRSquared

+0

Désolé, cela ne fonctionne pas non plus 'module itertools n'a pas d'attribut izip_longest' J'utilise Python 3 si cela aide et la version de pandas' 0.20.3' – Kvothe

+0

J'attendais une de ces mises à jour de Windows 10 (84%) et le Mac n'a que python2.7 - il a été renommé en zip_longest dans le plus récent Imin de Python –

1

Option 1

pd.DataFrame(nest, ['aa', 'bb', 'cc']).T 

    aa bb cc 
0 aa1 bb1 cc1 
1 aa2 bb2 cc2 
2 aa3 bb3 cc3 
3 aa4 bb4 None 
4 aa5 None None 

Option 2
Homebrew zip_longest

f = lambda x, n: x[n] if n < len(x) else None 
n, m = max(map(len, nest)), len(nest) 

pd.DataFrame(
    [[f(j, i) for j in nest] for i in range(n)], 
    columns=['aa', 'bb', 'cc'] 
) 

    aa bb cc 
0 aa1 bb1 cc1 
1 aa2 bb2 cc2 
2 aa3 bb3 cc3 
3 aa4 bb4 None 
4 aa5 None None 
+0

Désolé, l'option 1 ne semble pas fonctionner pour moi. '3 colonnes passées, les données transmises ont 5 colonnes' est l'erreur – Kvothe

+0

Quelle version des pandas utilisez-vous? 'pd .__ version__' – piRSquared

+0

' 0.20.3' est la version de pandas – Kvothe

0

Ou peut-être

pd.DataFrame(data={'value':nest},index=['aa', 'bb', 'cc']).value.apply(pd.Series).T 
Out[1297]: 
    aa bb cc 
0 aa1 bb1 cc1 
1 aa2 bb2 cc2 
2 aa3 bb3 cc3 
3 aa4 bb4 NaN 
4 aa5 NaN NaN 
liste