2017-10-17 9 views
1

J'ai un csv contenant environ 10k (10.000) rangées comme les suivantes:traitement d'une liste de chaînes pour supprimer les doublons et ajouter de la valeur correspondante

1: ['Andhra Pradesh-133', 'Meetai-1358', 'Meetai-2146', 'Meetai-2277'] 
... 
N: ['Andhra Pradesh-20', 'Rajasthan-60', 'Rajasthan-70'] 

Je dois combiner les valeurs répétées, par exemple:

['Andhra Pradesh-133', 'Meetai-5781'] // 5781 = 1358 + 2146 + 2277 

Quelqu'un peut-il suggérer un moyen rapide de le faire?

Répondre

0

Utilisation list comprehension avec groupby:

from itertools import groupby 


df = pd.DataFrame({'a':[['Andhra Pradesh-133', 'Meetai-1358', 'Meetai-2146', 'Meetai-2277'], 
         ['Andhra Pradesh-20', 'Rajasthan-60', 'Rajasthan-70']]}) 


data = [] 
for x in df['a']: 
    b = [a.split('-') for a in x] 
    L = [t for k, g in groupby(b, key=lambda x: x[0]) 
     for t in [k + '-' + str(sum((int(j) for i, j in g)))]] 
    data.append(L) 

print (data) 

[['Andhra Pradesh-133', 'Meetai-5781'], ['Andhra Pradesh-20', 'Rajasthan-130']] 

df['b'] = data 
print (df) 

                a \ 
0 [Andhra Pradesh-133, Meetai-1358, Meetai-2146,... 
1 [Andhra Pradesh-20, Rajasthan-60, Rajasthan-70] 

            b 
0 [Andhra Pradesh-133, Meetai-5781] 
1 [Andhra Pradesh-20, Rajasthan-130] 

EDIT:

Solution si l'entrée est un fichier:

data = [] 
for line in open('file.csv'): 
    #strip new-line characters, split by [ and get second list 
    items = line.strip('\r\n" ]').split('[')[1] 
    #split lines, remove whitespace 
    items = [item.strip("' ") for item in items.split(',')] 
    #split to sublist 
    items = [a.split('-') for a in items] 
    #sum splitted sublists 
    items = [t for k, g in groupby(items, key=lambda x: x[0]) 
       for t in [k + '-' + str(sum((int(j) for i, j in g)))]] 
    data.append(items) 

print (data) 
[['Andhra Pradesh-133', 'Meetai-5781'], ['Andhra Pradesh-20', 'Rajasthan-130']] 

EDIT :

Vous avez besoin divisé par la première apparition de [ puis bande [] aussi:

data = [] 
for line in open('file.csv'): 
    #strip new-line characters, split by [ and get second list 
    items = line.strip('\r\n" ]').split('[', 1)[1] 
    #split lines, remove whitespace 
    items = [item.strip("'[] ") for item in items.split(',')] 
    #split to sublist 
    items = [a.split('-') for a in items] 
    print (items) 
    #sum splitted sublists 
    items = [t for k, g in groupby(items, key=lambda x: x[0]) 
       for t in [k + '-' + str(sum((int(j) for i, j in g)))]] 
    data.append(items) 
+0

ont un petit doute ici si je considère x = [[ 'panjim-20', 'Uttar Pradesh-23185', ' Gujurat-1013 ',' Uttar Pradesh-51 '] le groupe de fonctions de déclaration par ne semble pas fonctionner. b = [a.split ('-') pour un dans x] pour k, g dans groupby (b, clé = lambda x: x [0]): ne se groupe pas par 'uttar Pradesh' aussi la chaîne est exactement le même. pourriez-vous aider à ce que doit être le miss? –

+0

Je pense qu'il y a un problème double '[['. Je modifie la réponse. – jezrael

+0

des excuses pour la faute de frappe x = ['panjim-20', 'Uttar Pradesh-23185', 'Gujurat-1013', 'Uttar Pradesh-51'] est la liste que j'essaie de traiter. ? –

0

Je créerais un dict pour chaque ligne. Analyser les numéros de chaîne en divisant ou en utilisant une regex. La chaîne par ex. 'Andhra Pradesh' est la clé, la valeur est un int. Ajoutez les nombres à la valeur de l'entrée dict déterminée par la chaîne.

0

Je ne sais pas si c'est le meilleur moyen de le faire, mais cela fonctionne pour moi:

data = [ 
    ['Andhra Pradesh-133', 'Meetai-1358', 'Meetai-2146', 'Meetai-2277'], 
    ['Andhra Pradesh-20','Rajasthan-60','Rajasthan-70'] 
] 

values = {} 
for row in data: 
    for x in row: 
    tokens = x.split('-') 
    values[tokens[0]] = int(tokens[1]) if tokens[0] not in values else values[tokens[0]] + int(tokens[1]) 
    out = [x + '-' + str(y) for x,y in values.iteritems()] 

print out # prints: ['Andhra Pradesh-153', 'Meetai-5781', 'Rajasthan-130'] 
0

Dans Pandas vous pourriez faire

In [3475]: L = ['Andhra Pradesh-133', 'Meetai-1358', 'Meetai-2146', 'Meetai-2277'] 

In [3476]: s = (pd.DataFrame(x.split('-') for x in L) 
        .assign(v=lambda x: x[1].astype(int)) 
        .groupby(0)['v'].sum()) 

In [3478]: (s.index + '-' + s.values.astype(str)).tolist() 
Out[3478]: ['Andhra Pradesh-133', 'Meetai-5781'] 

Détails

In [3480]: pd.DataFrame(x.split('-') for x in L) 
Out[3480]: 
       0  1 
0 Andhra Pradesh 133 
1   Meetai 1358 
2   Meetai 2146 
3   Meetai 2277 

La colonne 1 est de type str, nous assign ing colonne v avec le type int

In [3481]: pd.DataFrame(x.split('-') for x in L).assign(v=lambda x: x[1].astype(int)) 
Out[3481]: 
       0  1  v 
0 Andhra Pradesh 133 133 
1   Meetai 1358 1358 
2   Meetai 2146 2146 
3   Meetai 2277 2277 

In [3479]: s 
Out[3479]: 
0 
Andhra Pradesh  133 
Meetai   5781 
Name: v, dtype: int32