J'ai un tableau qui ressemble à ceci:

{'loc.1': array([  1,2,3,4,7,5,6]),'loc.2': array([  3,4,3,7,7,8,6]),'loc.3': array([  1,4,3,1,7,8,6]).....} 

Après a = pd.DataFrame (tableau), cela ressemble à ceci:

loc.1    loc.2  loc.3
1        3      1
2        4      4
3        3      3
4        7      1
7        7      7
5        8      8
6        6      6

C'est pourtant ce que je veux:

Col1.    Col.2 
loc.1    1,2,3,4,7,5,6
loc.2    3,4,3,7,7,8,6
loc.3    1,4,3,1,7,8,6 

J'en ai besoin dans ce format particulier car je souhaite concaténer par la suite avec une autre table. Les pandas seraient ma solution préférée ..

Merci et excuses si c'est une question idiote.

2
Alex Trevylan 17 avril 2018 à 18:42

4 réponses

Meilleure réponse

Tout d'abord, dictionary comprehension avez besoin de valeurs de jointure.

Ensuite, pour Series, utilisez:

a = pd.Series({k:','.join(v.astype(str)) for k, v in array.items()})
print (a)
loc.1    1,2,3,4,7,5,6
loc.2    3,4,3,7,7,8,6
loc.3    1,4,3,1,7,8,6
dtype: object

Et pour DataFrame:

d = {k:','.join(v.astype(str)) for k, v in array.items()}
a = pd.DataFrame({'a': list(d.keys()), 'b': list(d.values())})

La solution alternative est de créer des tuples:

L = [(k, ','.join(v.astype(str))) for k, v in array.items()]
a = pd.DataFrame(L, columns=['a','b'])

print (a)
       a              b
0  loc.1  1,2,3,4,7,5,6
1  loc.2  3,4,3,7,7,8,6
2  loc.3  1,4,3,1,7,8,6

Si besoin de tableaux dans la colonne, supprimez join avec un cast en string s:

L = [(k, v) for k, v in array.items()]
a = pd.DataFrame(L, columns=['a','b'])
print (a)
       a                      b
0  loc.1  [1, 2, 3, 4, 7, 5, 6]
1  loc.2  [3, 4, 3, 7, 7, 8, 6]
2  loc.3  [1, 4, 3, 1, 7, 8, 6]
3
jezrael 17 avril 2018 à 15:53

Vous pouvez utiliser stack avec groupby

df.stack().astype(str).groupby(level=1).apply(','.join)
Out[738]: 
loc.1    1,2,3,4,7,5,6
loc.2    3,4,3,7,7,8,6
loc.3    1,4,3,1,7,8,6
dtype: object
1
YOBEN_S 17 avril 2018 à 16:02

Quelques options selon le format dont vous avez besoin:

d = {'loc.1': np.array([  1,2,3,4,7,5,6]),
     'loc.2': np.array([  3,4,3,7,7,8,6]),
     'loc.3': np.array([  1,4,3,1,7,8,6])} 

res1 = pd.DataFrame([[x] for x in d.values()], index=d.keys())

#                            0
# loc.1  [1, 2, 3, 4, 7, 5, 6]
# loc.2  [3, 4, 3, 7, 7, 8, 6]
# loc.3  [1, 4, 3, 1, 7, 8, 6]

res2 = pd.DataFrame([', '.join(list(map(str, x))) for x in d.values()], index=d.keys())

#                          0
# loc.1  1, 2, 3, 4, 7, 5, 6
# loc.2  3, 4, 3, 7, 7, 8, 6
# loc.3  1, 4, 3, 1, 7, 8, 6
1
jpp 17 avril 2018 à 15:55
a = {'loc.1': [1,2,3,4,7,5,6],'loc.2': [3,4,3,7,7,8,6],'loc.3': [1,4,3,1,7,8,6]}
import pandas as pd
df = pd.DataFrame(a).transpose()
df['lists'] = df[[0,1,2,3,4,5,6]].values.tolist()
df = df['lists']

Production:

loc.1    [1, 2, 3, 4, 7, 5, 6]
loc.2    [3, 4, 3, 7, 7, 8, 6]
loc.3    [1, 4, 3, 1, 7, 8, 6]
Name: lists, dtype: object
1
max 17 avril 2018 à 15:56