2017-10-07 4 views
2

Je suis dans une situation un peu bizarre. J'ai déjà résolu mon problème de programmation auparavant, mais je regarde en arrière et j'essaie de l'implémenter en utilisant des pandas. J'ai pensé que ce serait un bon endroit pour pratiquer l'utilisation des pandas.Comment obtenir des lignes distinctes dans un fichier pandas df et fusionner les éléments en double dans une colonne?

J'interroge une base de données, je fais des calculs, puis j'affiche les résultats sur une interface graphique avec un QTableWidget PyQt.

Une table exemple après les calculs pourrait ressembler à ceci:

test_list = [["a", "b", "c", "d"], 
      ["1", "3", "5", "7"], 
      ["1", "4", "5", "7"], 
      ["2", "3", "6", "8"], 
      ["2", "4", "6", "9"]] 

Ce que je veux faire avant de l'afficher est: obtenir les lignes distinctes basées sur des colonnes « a », « c » et " d ", et fusionner les éléments abandonnés de la colonne" b "dans la colonne. Le résultat que je veux ressemble à ceci:

['a', 'b', 'c', 'd'] 
['1', '3, 4', '5', '7'] 
['2', '3', '6', '8'] 
['2', '4', '6', '9'] 

Remarquez comment dans la colonne « b », « 3, 4 » sont tous deux représentés dans leur ligne.

Voici comment je l'ai fait d'abord avec des listes et des dictionnaires:

boucle
def mergeDistinct(my_list): 
    new_list_dict = {} 

    for elem in my_list[1:]: 
     key_str = (elem[0], elem[2], elem[3]) 
     if key_str in new_list_dict.keys(): 
      new_list_dict[key_str][1] += ", " + elem[1] 
     else: 
      new_list_dict[key_str] = elem[::] 
      new_list_dict[key_str][1] = elem[1] 

    ret_list = new_list_dict.values() 

    return [my_list[0]] + ret_list 

I sur toutes les lignes et d'utiliser un dictionnaire pour garder une trace de combinaison distincte de valeurs que j'ai vu jusqu'à présent. Je pense que c'est un peu maladroit et j'essaie ma main à la bibliothèque pandas. Je pense que cela devrait certainement être possible mais peut-être que je ne connais pas le bon terme pour google pour comprendre comment le faire.

C'est ce que j'ai jusqu'à présent:

df = pd.DataFrame(data=test_list[1:], columns=test_list[0]) 

def mergeDistinctPandas(my_df): 
     #I feel like this is close but I don't know how to continue 
     df = my_df.set_index(['a', 'b', 'c', 'd']).groupby(level=['a', 'c', 'd']) 
     # for elem in df: 
      # print(elem) 
     # new_df = pd.DataFrame() 
     # for elem in df: 
      # merged = pd.concat([elem[1] for i, row in elem[1].iterrows()]) #.to_frame() 
      # merged.index = ['duplicate_{}'.format(i) for i in range(len(merged))] 
      # new_df = pd.concat([new_df, merged], axis=1) 

     return False 

Si j'imprimer ce que j'ai jusqu'à présent je vois les lignes sont séparées et je devrais être en mesure de les fusionner, en laissant « b » séparés, mais je ne vois pas comment le faire.

Si les pandas ne sont pas adaptés à ce problème, c'est bien aussi, j'essaie simplement de comprendre. Merci pour l'aide.

Voici quelques questions connexes que j'ai trouvé: How to "select distinct" across multiple data frame columns in pandas? et How do I merge duplicate rows into one on a DataFrame when they have different values

Répondre

4
df.groupby([‘a’, ‘c’, ‘d’]).b.apply(‘, ‘.join) \ 
    .reset_index()[df.columns] 
+0

LOL :-) virgule mignon – Wen