J'ai un ensemble de transactions financières avec une Date , Montant , Description et Source et je souhaite trouver des transactions lorsque le montant est le même, la date est dans la journée, mais les sources sont différentes. La source doit être différente car les transactions sont une importation provenant de nombreuses sources et chaque source a des entrées uniques.

Par exemple, je voudrais trouver que les lignes 1 et 3 sont des doublons:

'date','amount','description','source'
1/5/2018, 5.28, 'McDonalds', 'BankOfAmerica'
1/6/2018, 8.44, 'Starbucks', 'BankOfAmerica'
1/5/2018, 5.28, 'McDonalds Rest', 'BoA'
2/10/2018, 22.72, 'Chipolte', 'Chase'
3/10/2018, 4.58, 'Wendys', 'BoA'

J'ai essayé en Python et je peux trouver des doublons avec:

df_no_dups = df.drop_duplicates(subset=['amount','dates'])
df_dups = df[~df.isin(df_no_dups)].dropna()

Mais c'est une correspondance de date exacte et ensuite je dois exécuter un autre script pour m'assurer que les sources étaient différentes.

J'ai également essayé de regrouper des montants, puis de les parcourir pour trouver où les dates sont proches et les sources différentes, mais je n'ai pas pu comprendre les détails des groupes.

D'autres approches pourraient être avec SQL ou dans la feuille de calcul (google) où se trouvent les transactions.

1
bonhoffer 17 mars 2019 à 14:15

2 réponses

Meilleure réponse

L'utilisation existe

select t1.* from table_name t1
where exists( select 1 from table_name t2 
             where t2.date=t1.date and t2.amount=t1.amount and t1.source<>t2.source)
1
Zaynul Abadin Tuhin 17 mars 2019 à 11:37

Tenez compte des données suivantes (ajouté une ligne à la ligne 3 pour une meilleure compréhension)

data = pd.compat.StringIO("""5 Jan, 5.28, 'McDonalds', 'BankOfAmerica'
6 Jan, 8.44, 'Starbucks', 'BankOfAmerica'
5 Jan, 5.28, 'McDonalds Rest', 'BoA'
5 Jan, 5.28, 'McDonalds Rest', 'BankOfAmerica'
10 Feb, 22.72, 'Chipolte', 'Chase'""")
df = pd.read_csv(data,header=None)
df.columns=['Date','Amount','Dscription','Source']
print(df)

 Date  Amount         Dscription            Source
0   5 Jan    5.28        'McDonalds'   'BankOfAmerica'
1   6 Jan    8.44        'Starbucks'   'BankOfAmerica'
2   5 Jan    5.28   'McDonalds Rest'             'BoA'
3   5 Jan    5.28   'McDonalds Rest'   'BankOfAmerica'
4  10 Feb   22.72         'Chipolte'           'Chase'

Pour les doublons et différentes sources:

df_dups =df[df.duplicated(['Date','Amount'],keep=False)]
df_dups =df_dups.drop_duplicates(['Date','Amount','Source'],keep=False)
print(df_dups)


    Date  Amount         Dscription            Source
0  5 Jan    5.28        'McDonalds'   'BankOfAmerica'
2  5 Jan    5.28   'McDonalds Rest'             'BoA'

Pour aucun doublon (en tirant toutes les autres lignes essentiellement df - df_dup):

no_dups=df.loc[~df.index.isin(df_dups.index)]
print(no_dups)

     Date    Amount      Dscription            Source
1   6 Jan    8.44        'Starbucks'   'BankOfAmerica'
3   5 Jan    5.28   'McDonalds Rest'   'BankOfAmerica'
4  10 Feb   22.72         'Chipolte'           'Chase'
2
bonhoffer 17 mars 2019 à 21:32