-4
votes

Divisez le dataframe pandas par colonne puis ajoutez

J'ai le dataframe:

entrez la description de l'image ici

Je veux garder les trois premières colonnes, puis les empiler au-dessus des 3 colonnes suivantes, de sorte que j'ai un dataframe avec juste ["userID", "tweetID", "time"] à la fin.


3 commentaires

Veuillez ne pas partager les données sous forme d'image mais sous forme de texte afin de pouvoir les reproduire facilement. Personne ne veut écrire des données à la main. De plus, afin de produire un exemple minimal et reproductible , modifiez la question avec le résultat souhaité.


@AlexandreB. Je l'ai partagé sous forme d'image car je pensais que ce serait plus facile à visualiser. De plus, la sortie souhaitée se trouve à la fin de la question. Je veux simplement prendre des colonnes dont le nom se termine par "_end" et les empiler sous les 3 premières colonnes.


@Qubix, c'est beaucoup plus facile pour les assistants SO si l'entrée est textuelle, car les données peuvent être copiées dans un interpréteur python en cours d'exécution. également si la sortie attendue sous forme de texte, elle peut être comparée à la sortie produite via le code.


3 Réponses :


0
votes

Il semble que vous ayez besoin de pd.wide_to_long :

df.columns=df.columns.str.split('_').map(lambda x : '_'.join(x[::-1]))
s=pd.wide_to_long(df.reset_index(),['end','start'],i='index',j='drop',sep='_',suffix='\w+').stack().unstack(-2)


2 commentaires

cela ne fonctionne pas: ValueError: Incompatibilité de longueur: 100 lignes attendues, tableau reçu de longueur 3


@Qubix vérifiez la mise à jour, c'est juste ce que je comprends, si ce n'est toujours pas ce dont vous avez besoin, veuillez inclure le résultat attendu



0
votes
start_cols = [c for c in df.columns if c.endswith('_start')]
end_cols = [c for c in df.columns if c.endswith('_end')]

def rename(x): return x.split('_')[0]

output_df = pd.concat([
    df[start_cols].rename(columns=rename), 
    df[end_cols].rename(columns=rename)
])
You can subset the start & end columns in two dataframes & pd.concat them together to stack.

0 commentaires

1
votes
df_top = tree_df[['userID_start', 'tweetID_start', 'time_start']]
df_top.columns = ['userID', 'tweetID', 'time']
df_bottom = tree_df[['userID_end', 'tweetID_end', 'time_end']]
df_bottom.columns = ['userID', 'tweetID', 'time']
final_df = pd.concat([df_top, df_bottom])
This works.

0 commentaires