2 votes

Python Pandas DataFrame Fondu

J'ai cela comme un dataframe:

custid   jour  freq
346782   1     0
346782   0     1
346782   1     2
346783   0     0
346783   0     1
346783   0     2

Mais dans le but de l'apprentissage automatique, je veux semi-transposer ceci en:

346782 1 0 0 1 1 2 
346783 0 0 0 1 0 2

Vous savez, de sorte que le custID ne vienne qu'une seule fois avec TOUTES ses caractéristiques associées dans une seule rangée devant lui.

J'ai essayé diverses choses telles que:

df1 = pd.melt(newdf, id_vars=['0']).drop('variable', axis=1).sort_values(0)

Comment puis-je accomplir cette transformation?

3voto

W-B Points 94428

Je suis en train d'utiliser stack ici, vous pouvez également essayer melt

s=df.set_index('custid').stack()

s.index=pd.MultiIndex.from_arrays([s.index.get_level_values(level=0),s.groupby(level=0).cumcount()])
s.unstack()
Out[843]: 
        0  1  2  3  4  5
custid                  
346782  1  0  0  1  1  2
346783  0  0  0  1  0  2

0voto

Tai Points 4569

Vous pouvez également essayer numpy.ravel.

df.groupby("custid").apply(lambda x: x[["day", "freq"]].values.ravel())
custid
346782    [1, 0, 0, 1, 1, 2]
346783    [0, 0, 0, 1, 0, 2]
dtype: object

pd.DataFrame(
  df.groupby("custid").apply(lambda x: x[["day", "freq"]].values.ravel()).to_dict()
).T

        0   1   2   3   4   5
346782  1   0   0   1   1   2
346783  0   0   0   1   0   2

0voto

John Galt Points 1144

Utiliser

In [192]: pd.DataFrame.from_dict(
            {k: x[['day', 'freq']].values.flatten() for k, x in df.groupby('custid')}, 
            orient='index')
Out[192]:
        0  1  2  3  4  5
346782  1  0  0  1  1  2
346783  0  0  0  1  0  2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X