2017-05-03 1 views
4

lange Zeit lurker, aber das erste Mal Poster auf StackOverflow.Vermeiden Sie die Duplizierung von Zeilen bei der Zusammenführung

Ich habe eine Wand mit einem Datenanalyseprojekt getroffen, an dem ich arbeite.

Wesentlichen, wenn ich zB CSV 'A':

id | item_num 
A123 |  1 
A123 |  2 
B456 |  1 

Und ich habe zB CSV 'B':

id | description 
A123 | Mary had a... 
A123 | ...little lamb. 
B456 | ...Its fleece... 

Wenn ich ein merge mit Pandas durchführen, es endet wie dies:

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | Mary had a... 
A123 |  1 | ...little lamb. 
A123 |  2 | ...little lamb. 
B456 |  1 | Its fleece... 

Wie könnte ich stattdessen es werden:

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | ...little lamb... 
B456 |  1 | Its fleece... 

Dies ist mein Code:

import pandas as pd 

# Import CSVs 
first = pd.read_csv("../PATH_TO_CSV/A.csv") 
print("Imported first CSV: " + str(first.shape)) 
second = pd.read_csv("../PATH_TO_CSV/B.csv") 
print("Imported second CSV: " + str(second.shape)) 


# Create a resultant, but empty, DF, and then append the merge. 
result = pd.DataFrame() 
result = result.append(pd.merge(first, second), ignore_index = True) 
print("Merged CSVs... resulting DataFrame is: " + str(result.shape)) 

# Lets do a "dedupe" to deal with an issue on how Pandas handles datetime merges 
# I read about an issue where if datetime is involved, duplicate entires will be created. 
result = result.drop_duplicates() 
print("Deduping... resulting DataFrame is: " + str(result.shape)) 

# Save to another CSV 
result.to_csv("EXPORT.csv", index=False) 
print("Saved to file.") 

ich wirklich jede mögliche Hilfe schätzen würde - ich bin sehr fest! Und ich habe es mit mehr als 20.000 Zeilen zu tun.

Danke.

Edit: mein Beitrag wurde als ein potenzielles Duplikat markiert. Es ist nicht, da ich nicht unbedingt versuche, eine Spalte hinzuzufügen - ich versuche nur zu verhindern, dass die description mit der Anzahl von item_num multipliziert wird, die einer bestimmten id zugeschrieben werden.


UPDATE 21.06:

Wie könnte ich die Zusammenführung zu tun, wenn die 2 Verschlechterungsfaktoren wie diese stattdessen sehen?

id | item_num | other_col 
A123 |  1 | lorem ipsum 
A123 |  2 | dolor sit 
A123 |  3 | amet, consectetur 
B456 |  1 | lorem ipsum 

Und ich habe zB CSV 'B':

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | ...little lamb. 
B456 |  1 | ...Its fleece... 

So beende ich oben mit:

id | item_num | other_col | description 
A123 |  1 | lorem ipsum | Mary Had a... 
A123 |  2 | dolor sit | ...little lamb. 
B456 |  1 | lorem ipsum | ...Its fleece... 

Bedeutung, die Zeile, die die 3, mit „amet, consectetur hat "in der anderen Spalte" wird ignoriert.

+0

Mögliche Duplikat [Hinzufügen neuer Spalte zu bestehenden Datenrahmen in Python Pandas] (http://stackoverflow.com/questions/12555323/adding-new-column-to-existing-Datenrahmen-in-Python-Pandas) – TemporalWolf

+0

Es sieht so aus, als ob Sie ['concat' oder' append'] möchten (http://pandas.pydata.org/pandas- docs/stable/merging.html), nicht "fusionieren". – TemporalWolf

Antwort

1

ich es auf diese Weise tun würde:

In [135]: result = A.merge(B.assign(item_num=B.groupby('id').cumcount()+1)) 

In [136]: result 
Out[136]: 
    id item_num  description 
0 A123   1  Mary had a... 
1 A123   2 ...little lamb. 
2 B456   1 ...Its fleece... 

Erläuterung: wir können "virtuelle" item_num Spalte in der B DF schaffen für den Beitritt:

In [137]: B.assign(item_num=B.groupby('id').cumcount()+1) 
Out[137]: 
    id  description item_num 
0 A123  Mary had a...   1 
1 A123 ...little lamb.   2 
2 B456 ...Its fleece...   1 
+0

Ich wünschte, dies hätte für mich funktioniert, aber es scheint nur keine der Daten enthalten eine der CSVs. Tatsächlich ist die resultierende CSV nur eine Kopie einer der CSVs. – kabaname

+1

@kabaname, sind Sie sicher, dass Sie das Ergebnis der Zusammenführung zugewiesen haben? – MaxU

+0

vergiss es, also habe ich es geschafft, das Ergebnis zu erzeugen - aber es multipliziert immer noch die Zeilen, um die Beschreibungen für "1" und "2" genau wie in meinem Beispiel zu wiederholen. Mit anderen Worten: "Maria hatte ein ..." wiederholt sich für 1 und 2 und dann wiederholt sich "... kleines Lamm". @maxu – kabaname

1

bereites df Indizierung und fallen dann Duplikate:

df = df.set_index(['id', 'item_num']).drop_duplicates() 
+0

Also habe ich das versucht, und es scheint beide Spalten und alle Daten entfernt zu haben ... aber das hat das Problem der Duplizierung gelöst, da die restlichen Daten nicht wie zuvor dupliziert wurden. – kabaname

1

Ich glaube, Sie brauchen concat

result = pd.concat([df1.set_index('id'), df2.set_index('id')],axis = 1).reset_index() 

Sie erhalten

id  item_no  description 
0 A123 1   Mary had a... 
1 A123 2   ...little lamb 
2 B456 1   ...Its fleece... 
+0

Ich erhalte einen 'ValueError: Form der übergebenen Werte ist (13, 10799), Indizes implizieren (13, 6240)' – kabaname

Verwandte Themen