2017-10-19 26 views
0

J'ai cherché une solution à ce problème et toutes les réponses ne semblent pas fonctionner alors j'ai décidé de demander de l'aide sur ce cas d'utilisation spécifique. Je fusionne deux csv qui ont des dimensions différentes mais partagent deux colonnes égales. J'ai d'abord placé les années csv dans une trame de données de pandas géants qui ressemblent à ceci:Pandas supprimant des lignes dupliquées lors de la fusion de deux CSV avec des dimensions différentes

df_td et df_ld:

>>> df_td.head(2) 
    trans_id store_num cust_id    bus_date   type 
0 0000001  104 111111 10/5/2017 12:00:00 AM  Payment 
1 0000002  104 111111 10/5/2017 12:00:00 AM  Payment 
2 0000003  104 111111 10/5/2017 12:00:00 AM  Received 



>>> df_ld.head(2) 
    cust_id nxt_date store_num amt_received   type_rec 
0 111111 11/5/2017  104   10.00   NaN 
1 111112 11/6/2017  104   10.00   NaN 

Après l'exécution de ce code:

merged = pd.merge(df_td, df_ld, how='inner', on=['cust_id','store_num']).fillna(0) 

Je cette fusion dataframe:

>>> df_td_ld.head(3) 
    trans_id store_num cust_id    bus_date   type nxt_date amt_received type_rec 
0 0000001  104 111111 10/5/2017 12:00:00 AM  Payment 11/5/2017   10.00  NaN 
1 0000002  104 111111 10/5/2017 12:00:00 AM  Payment 11/5/2017   10.00  NaN 
2 0000003  104 111111 10/5/2017 12:00:00 AM  Received 11/5/2017   10.00  NaN 

Comme vous pouvez le voir, je reçois des dups dans les colonnes df_ld puisque le cust_id 111111 apparaît seulement une fois dans t hat dataframe. Si j'essaie d'interroger et de sommer cette colonne, elle indiquera 30,00 au lieu des 10,00 corrects à cette date, pour ce client, dans ce magasin. Je ai essayé outer, left, right ainsi que concat et join fonctions, mais soit obtenir la même sortie ou quelque chose de complètement faux.

Ce que je voudrais est ceci:

trans_id store_num cust_id    bus_date   type nxt_date amt_received type_rec 
0 0000001  104 111111 10/5/2017 12:00:00 AM  Payment 11/5/2017    0  NaN 
1 0000002  104 111111 10/5/2017 12:00:00 AM  Payment 11/5/2017    0  NaN 
2 0000003  104 111111 10/5/2017 12:00:00 AM  Received 11/5/2017   10.00  NaN 

Est-il possible avec merg/join/concat que cela est possible? Merci!

+0

Cela pourrait aider: Merci Nathan http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.drop_duplicates.html –

Répondre

1

Ne pouvez-vous pas simplement définir toutes les valeurs applicables de amt_received à 0 après la fusion?

merged = pd.merge(df_td, df_ld, how='inner', on=['cust_id','store_num']) 
merged.loc[merged.type_y != 'Received','amt_received'] = 0 

    cust_id nxt_date store_num amt_received type_x trans_id bus_date type_y 
0 111111 11/5/2017 104   0.0      1  10/5/2017 Payment 
1 111111 11/5/2017 104   0.0      2  10/5/2017 Payment 
2 111111 11/5/2017 104   10.0     3  10/5/2017 Received 
+0

pour votre réponse. J'ai passé le week-end à jouer avec ça car j'aime ton processus de réflexion. Le problème que je rencontre est que mon dataframe réel a plus d'un statut sous type_y. Par conséquent, certains éléments avec des types de statut non liés qui ne sont pas décrits dans mon fichier de données initial sont mis à zéro. Je m'excuse de ne pas l'avoir ajouté car j'espérais qu'il y avait un argument qui me manquait dans la fonction pd.merge. Existe-t-il un autre moyen de contourner votre suggestion afin d'éviter ces types de sous-statuts? –

+0

Cela a fonctionné bien que je n'étais pas en mesure de trouver un moyen facile de traiter les types de sous-statut, donc je devais juste le décomposer en lignes séparées. –

+0

@ Prof.Falken, si vous postez d'autres exemples de données que vous avez, je devrais être en mesure de vous aider. Pourriez-vous me donner des exemples de ce que vous voulez dire? –