1
votes

Créer des colonnes à partir d'un élément unique de data.frame dans R

J'ai besoin de votre aide pour résoudre la fin de mon script.

Le problème est que je dois obtenir à partir de ce tableau

   ID       CITY_1  CITY_2  CITY_3  CITY_4  CITY_5
105274551    Roma     0      0        0      0
104746182    Roma     0      0        0      0
105486829    Roma     0      0        0      0
105479022    Roma     0      0        0      0
105307655    Roma   Genova  Firenze   0      0
105384177    Roma   Milano  Reggio  Napoli   0
105486831    Aosta    0      0        0      0
105486833    Milano   0      0        0      0
105486835    Verona   0      0        0      0
105486836   Firenze   0      0        0      0

ce tableau:

ID          CITY
105274551   Roma 
104746182   Roma 
105486829   Roma 
105479022   Roma
105307655   Roma 
105384177   Roma 
105384177   Milano 
105384177   Reggio 
105486831   Aosta 
105384177   Milano 
105486833   Milano
105384177   Napoli 
105486835   Verona 
105486836   Firenze 
105307655   Genova
105307655   Firenze

Mon objectif est pour créer autant de colonnes qu'il y a de valeurs dans la colonne de ville.

J'aimerais savoir s'il existe une bibliothèque ou un tutoriel / réponse qui pourrait m'aider à créer ce type de script.

Merci d'avance.

Francesco


0 commentaires

3 Réponses :


1
votes

Nous pouvons créer une nouvelle colonne avec "CITY" et son numéro de ligne ( col ) pour chaque ID , puis obtenir les données au format large.

df <- structure(list(ID = c(105274551L, 104746182L, 105486829L, 105479022L, 
105307655L, 105384177L, 105384177L, 105384177L, 105486831L, 105384177L, 
105486833L, 105384177L, 105486835L, 105486836L, 105307655L, 105307655L
), CITY = c("Roma", "Roma", "Roma", "Roma", "Roma", "Roma", "Milano", 
"Reggio", "Aosta", "Milano", "Milano", "Napoli", "Verona", "Firenze", 
"Genova", "Firenze")), row.names = c(NA, -16L), class = "data.frame")


0 commentaires

0
votes

À l'aide du dictionnaire, vous pouvez mapper l'ID en tant que clé de dictionnaire et ajouter des villes ayant les mêmes ID que les valeurs
105307655 ['Roma', 'Milano', 'Reggio', 'Napoli']
105479022 ['Roma']
105486833 ['Milano']

sortie

import pandas as pd
#taken sample records only
dict1={'ID':[105307655,105479022,105307655,105307655,105486833,105307655],'CITY':[ 'Roma','Roma','Milano','Reggio','Milano','Napoli']}
df=pd.DataFrame(dict1)


dictfinal={}

for i in range(0,len(dict1['ID'])):
    key=dict1['ID'][i]
    if ID as key is already present in dictionary just append the city to value
    if(key in dictfinal.keys()):     

        dictfinal[key].append(dict1['CITY'][i])
    #if ID is not present in dictionary ,then first add ID as key to dictionary and the add value as list to dictionary.
    adding value as list because we can append more cities to list
    else:

        dictfinal[key]=[dict1['CITY'][i]]

#printing final dictionary

for k,v in dictfinal.items():
    print(k,v)

1 commentaires

Merci pour votre réponse, mais la langue est R.



1
votes

Nous pouvons utiliser dcast de data.table

df <- structure(list(ID = c(105274551L, 104746182L, 105486829L, 105479022L, 
105307655L, 105384177L, 105384177L, 105384177L, 105486831L, 105384177L, 
105486833L, 105384177L, 105486835L, 105486836L, 105307655L, 105307655L
), CITY = c("Roma", "Roma", "Roma", "Roma", "Roma", "Roma", "Milano", 
"Reggio", "Aosta", "Milano", "Milano", "Napoli", "Verona", "Firenze", 
"Genova", "Firenze")), row.names = c(NA, -16L), class = "data.frame")

data

library(data.table)
dcast(setDT(df), ID ~ paste0("CITY_", rowid(ID)), value.var = 'CITY')
#          ID  CITY_1 CITY_2  CITY_3 CITY_4 CITY_5
# 1: 104746182    Roma   <NA>    <NA>   <NA>   <NA>
# 2: 105274551    Roma   <NA>    <NA>   <NA>   <NA>
# 3: 105307655    Roma Genova Firenze   <NA>   <NA>
# 4: 105384177    Roma Milano  Reggio Milano Napoli
# 5: 105479022    Roma   <NA>    <NA>   <NA>   <NA>
# 6: 105486829    Roma   <NA>    <NA>   <NA>   <NA>
# 7: 105486831   Aosta   <NA>    <NA>   <NA>   <NA>
# 8: 105486833  Milano   <NA>    <NA>   <NA>   <NA>
# 9: 105486835  Verona   <NA>    <NA>   <NA>   <NA>
#10: 105486836 Firenze   <NA>    <NA>   <NA>   <NA>


0 commentaires