Je ne sais pas comment faire tolist () sur une colonne sans supprimer d'autres colonnes.

J'ai 3 colonnes

category      |        item         |    subcategory

Construction  |  [28, 0, 72168025]  |     tools

Je veux décompresser df.item si mal:

category      |  name   |  price  |   view     |  subcategory

Construction  |   28    |    0    |  72168025  |    tools

J'ai fait:

df = pd.DataFrame(df.item.tolist(), columns=['Name', 'Price', 'View']) 

Mais je reçois:

|  name   |  price  |   view     |

|   28    |    0    |  72168025  |  

Comment inclure d'autres colonnes dans df.

0
Deskom88 27 janv. 2019 à 22:55

4 réponses

Meilleure réponse

join + pop

Rejoignez une trame de données construite à partir d'une liste de listes:

df = df.join(pd.DataFrame(df.pop('item').values.tolist()).add_prefix('item'))

Exemple

# data from @cronoik
data = [('Construction',[28,0,7216825], 'tools')]
labels = ['category', 'item', 'subcategory']
df = pd.DataFrame.from_records(data, columns=labels)

df = df.join(pd.DataFrame(df.pop('item').values.tolist()).add_prefix('item'))

print(df)

       category subcategory  item0  item1    item2
0  Construction       tools     28      0  7216825
1
jpp 27 janv. 2019 à 20:18

Vous pouvez utiliser votre solution d'origine et joindre le résultat à votre DataFrame d'origine, en supprimant la colonne d'origine:

df2 = pd.DataFrame(df.item.tolist(), columns=['Name', 'Price', 'View'], index=df.index)
final_df = df.join(df2).drop("item", axis=1) 
0
Sven Harris 27 janv. 2019 à 20:09

Si votre colonne se compose d'une liste sur chaque ligne, vous n'avez pas besoin de .tolist() pour le convertir en colonnes distinctes.

Voici une approche possible pour résoudre ce problème

Générer des données factices

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,1), columns=list('A'))
df['category'] = 'Construction'
df['item'] = [[28,0,72168025]]*df.shape[0]
df['subcategory'] = 'tools'
print(df)
          A      category               item subcategory
0  0.972818  Construction  [28, 0, 72168025]       tools
1  0.583059  Construction  [28, 0, 72168025]       tools
2  0.784836  Construction  [28, 0, 72168025]       tools
3  0.393868  Construction  [28, 0, 72168025]       tools
4  0.806041  Construction  [28, 0, 72168025]       tools
5  0.871041  Construction  [28, 0, 72168025]       tools
6  0.573951  Construction  [28, 0, 72168025]       tools
7  0.513052  Construction  [28, 0, 72168025]       tools
8  0.982331  Construction  [28, 0, 72168025]       tools
9  0.713301  Construction  [28, 0, 72168025]       tools

Maintenant, utilisez apply(pd.Series) dans la colonne item (par cette publication SO ou celui-ci) pour obtenir une trame de données distincte, où chaque élément de la liste correspond à une série pandas distincte et attribuer des noms de colonne

df_split = df['item'].apply(pd.Series)
df_split.columns = ['Name', 'Price', 'View']

Enfin concaténer la trame de données d'origine avec la nouvelle trame de données (divisée)

df = pd.concat([df, df_split], axis=1)

Production

print(df)
          A      category               item subcategory  Name  Price      View
0  0.684692  Construction  [28, 0, 72168025]       tools    28      0  72168025
1  0.404291  Construction  [28, 0, 72168025]       tools    28      0  72168025
2  0.084463  Construction  [28, 0, 72168025]       tools    28      0  72168025
3  0.060698  Construction  [28, 0, 72168025]       tools    28      0  72168025
4  0.096269  Construction  [28, 0, 72168025]       tools    28      0  72168025
5  0.539278  Construction  [28, 0, 72168025]       tools    28      0  72168025
6  0.159661  Construction  [28, 0, 72168025]       tools    28      0  72168025
7  0.651479  Construction  [28, 0, 72168025]       tools    28      0  72168025
8  0.961392  Construction  [28, 0, 72168025]       tools    28      0  72168025
9  0.741887  Construction  [28, 0, 72168025]       tools    28      0  72168025

(Facultatif) Supprimez la colonne item d'origine

df.drop(['item'], axis=1, inplace=True)
print(df)
          A      category subcategory  Name  Price      View
0  0.833281  Construction       tools    28      0  72168025
1  0.229584  Construction       tools    28      0  72168025
2  0.403571  Construction       tools    28      0  72168025
3  0.822803  Construction       tools    28      0  72168025
4  0.968666  Construction       tools    28      0  72168025
5  0.053424  Construction       tools    28      0  72168025
6  0.759824  Construction       tools    28      0  72168025
7  0.766610  Construction       tools    28      0  72168025
8  0.752378  Construction       tools    28      0  72168025
9  0.056715  Construction       tools    28      0  72168025

Modifier: bien que cette approche soit faisable, il existe des approches plus rapides que d'utiliser apply - voir ici.

1
edesz 30 janv. 2019 à 05:15

Vous obtenez ce résultat car vous créez une nouvelle trame de données à partir de votre colonne d'élément. Ce que vous voulez réellement faire, c'est ajouter de nouvelles colonnes à votre dataframe existant:

import pandas as pd
data = [('Construction',[28,0,7216825], 'tools')]
labels = ['category', 'item', 'subcategory']
df = pd.DataFrame.from_records(data, columns=labels)

#Adding the new columns based on the split
df[['name','price', 'view']] = pd.DataFrame(df.item.tolist())
#dropping the unneeded item column
df.drop('item', axis=1, inplace=True )
0
cronoik 27 janv. 2019 à 20:12