2017-03-24 1 views
1

Ich habe diese zwei Spalten in meinem csv (Adresse von New Home und Cancelled Can in der CSV). Wenn eine Adresse gelöscht wird, muss unter Can True geschrieben werden, aber manchmal vergisst der Endbenutzer, True zu schreiben und die gleiche Adresse erscheint zweimal. Ich möchte Python zu sagen Sie mir (nicht entfernen) die Adressen, die zweimal erscheinen, ohne dass die erste aufgehoben wird.Zeige mir doppelte Adressen pandas

Beispiel:

Date_Booked   Address of New Home      Can 

01/07/2017   1234 SO Drive        True 
02/14/2017   4321 Python Court 
03/17/2017   1234 SO Drive 
03/23/2017   4321 Python Court  

Wie Sie aus dem obigen Beispiel 1234 SO-Laufwerk wurde abgebrochen ansehen und Wahre geschrieben wurde, ist das, was wir wollen, aber 4321 Python Court wurde, dass abgebrochen wird, warum es zweimal geschrieben wurde aber da es unter Cancelled nicht True heißt, wird es zweimal in unserem csv auftauchen und alle möglichen Probleme verursachen.

import pandas as pd 

first = pd.read_csv('Z:PCR.csv') 
df = pd.DataFrame(first) 

non_cancelled = df['Can'].apply(lambda x: x != 'True') 

dup_addresses = non_cancelled.groupby('Address of New Home').filter(lambda x: len (x) > 1) 
if not dup_addresses.empty: 
    raise Exception ('Same address written twice without cancellation') 

Ich erhalte die folgende Fehlermeldung:

Traceback (most recent call last): 
File "pandas\index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas\index.c:4279) 
File "pandas\src\hashtable_class_helper.pxi", line 404, in pandas.hashtable.Int64HashTable.get_item (pandas\hashtable.c:8543) 
TypeError: an integer is required 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 

dup_addresses = non_cancelled.groupby('Address of New Home').filter(lambda x: len (x) > 1) 
KeyError: 'Address of New Home' 

Jede Hilfe wäre sehr dankbar.

Antwort

1

Dies sollte Ihre Can Spalt aktualisieren, indem Sie die True halten, die schon da ist eine Aktualisierung mit denen, die verpasst wurden.

can = df.duplicated(subset=['Address of New Home'], keep='last') 
df['Can'] = df.Can.combine_first(can.where(can, '')) 
print(df) 

    Date_Booked Address of New Home Can 
0 01/07/2017  1234 SO Drive True 
1 02/14/2017 4321 Python Court True 
2 03/17/2017  1234 SO Drive  
3 03/23/2017 4321 Python Court  

Per

Anfrage
can = df.duplicated(subset=['Address of New Home'], keep='last') 
df['Can'] = df.Can.combine_first(pd.Series(np.where(can, 'Missed', ''), df.index)) 
print(df) 

    Date_Booked Address of New Home  Can 
0 01/07/2017  1234 SO Drive True 
1 02/14/2017 4321 Python Court Missed 
2 03/17/2017  1234 SO Drive   
3 03/23/2017 4321 Python Court 
+0

Danke, gibt es trotzdem, anstatt sie mit 'True' zu ​​aktualisieren, kann ich sie bitte mit' End User Misssed' aktualisieren. –

+0

np ist 'numpy' Ich nehme an, richtig? –

+0

@JakeWagner ja, tut mir leid. Numpy, wo ist in diesem Fall bequemer.Die Syntax ist sauberer. Wir könnten Pandas immer noch benutzen, aber es ist ein bisschen hässlicher. Denken Sie daran, wir könnten uns viele Möglichkeiten vorstellen, dies zu lösen. Es war zu verstehen, was du am meisten herausforderst. – piRSquared

0

Ihre Spalte ist Address_of_New_Home, nicht Address of New Home. Nur vergessen, die Unterstrichen

+0

Leider schrieb es mit Strich verwendet, da die Programmierung, meine Entschuldigung. Es sollte "Adresse des neuen Hauses" sein. –

0

Das Problem in dieser Aussage ist:

non_cancelled = df['Can'].apply(lambda x: x != 'True') 

Wenn Sie dieses Argument gelten, bis Sie auf die Serie df anwenden [ ‚Can‘], so dass die Methode eine Reihe zurückgibt, nicht der vollständige DataFrame. Zur Veranschaulichung hier einige Code:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'a': np.arange(0,5), 'b': np.arange(5,10), 'c': np.arange(10,15)}) 
print(df) 

Der Ausgang ist diese

a b c 
0 0 5 10 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 

Aber wenn ich dies tun:

a = df['a'].apply(lambda x: x*20) 
print(a) 

ich:

0  0 
1 20 
2 40 
3 60 
4 80 

zu Tun Sie, was Sie tun möchten, versuchen Sie es stattdessen:

non_cancelled = df[df['Can'] != True] 

Diese uns alle Zeilen in dem Datenrahmen gibt, wo die Bedingung (df [ ‚Can‘]! = True)

als True zurück
Verwandte Themen