2017-04-03 4 views
1

Ich verbrachte gerade eine Stunde auf stackoverflow, der nach einer ähnlichen Frage sucht, also entschuldigen Sie bitte, wenn dieses vorher gebeten worden ist und ich es nicht gefunden habe.Python pandas flag, das Werte in der Spalte in einem Datenrahmen zur Spalte in einem anderen Datenrahmen

Ich habe folgenden Datenrahmen df:

Id | Category | Subcategory | Count | Flag | Phone_number 
    1  A   aa  4534  Y  222-444-3333 
    2  B   bb  4807  Y  3335557777 
    3  C   cc  8978   222-444-3333 
    4  D   dd  9874   333-555-7777 
    5  E   ee  3187   555-666-8888 
    6  F   ff  8573   5556668888 

Die Spalte "Flag" zeigt falsche Datensätze etabliert. Jetzt muss ich alle Datensätze markieren/markieren, die dieselbe Telefonnummer haben, obwohl sie keine Flagge haben.

Zuerst muss ich alle "-" aus Telefonnummer herausnehmen, da es von Benutzern eingegeben wurde.

df['Phone_number'] = df['Phone_number'].str.replace('-', '') 

(nicht sicher, dies ist der beste Weg)

Als nächstes ich keine bessere Art und Weise denken, könnte es eine neue erstellen df von Datensätzen mit der Y-Flag dann zu nähern und ohne die Y-Flagge .

new_df = df.loc[df['Flag'] == 'Y'] 
df_withoutY = df.loc[df['Flag'] != 'Y'] 

Aber jetzt bin ich fest. Wie vergleiche ich die Telefonnummer in df_withoutY und wenn sie in new_df vorhanden ist, füge eine neue Spalte "incorrect" = "Y" hinzu.

Ich dachte an so etwas, aber alles False bekommen.

df_withoutY['Phone_number'].isin(new_df['Phone_number']) 

Das hat nicht funktioniert:

df_withoutY['incorrect'] = np.where((df_withoutY['Phone_number'].isin(new_df['Phone_number'])) == True, "Y" " ") 

TypeError: invalid type comparison 

Nicht sicher, ob dies hilfreich ist, aber in Excel, würde ich die beiden in zwei separaten Registerkarten von Flag geteilt haben und verwendet dann die Match-Funktion.

=MATCH(df_withoutY!AK2,new_df!AK$2:AK$3395,0) 

Wenn ich das tue, ich die beiden dfs wurde Hobeln wieder zusammen auf Verschmelzung, aber jetzt die neue Spalte „falsch“ ist. Wenn es einen Ansatz geben würde, ohne die Daten zu teilen, wäre das sogar noch besser.

Dies ist das Ende Ziel df:

Id | Category | Subcategory | Count | Flag | Phone_number | incorrect 
    1  A   aa  4534  Y  222-444-3333 
    2  B   bb  4807  Y  3335557777 
    3  C   cc  8978   222-444-3333  Y 
    4  D   dd  9874   333-555-7777  Y 
    5  E   ee  3187   555-666-8888 
    6  F   ff  8573   5556668888 

Danke

+0

, wenn ich eine Chance habe, werde ich einen tieferen Einblick nehmen. – piRSquared

Antwort

1

Versuchen Sie folgendes:

In [219]: phones_normalized = df.Phone_number.str.replace('-','') 

In [220]: df['incorrect'] = \ 
    ...: np.where(phones_normalized.isin(df.loc[df.Flag=='Y', 'Phone_number'].str.replace('-','')) 
    ...:   & (df.Flag!='Y'), 
    ...:   'Y', 
    ...:   '') 
    ...: 

In [221]: df 
Out[221]: 
    Id Category Subcategory Count Flag Phone_number incorrect 
0 1  A   aa 4534 Y 222-444-3333 
1 2  B   bb 4807 Y 3335557777 
2 3  C   cc 8978  222-444-3333   Y 
3 4  D   dd 9874  333-555-7777   Y 
4 5  E   ee 3187  555-666-8888 

alternativ können Sie "Wiederverwendung" Ihre Flag Säule:

In [226]: df.loc[df.Phone_number.str.replace('\D+','').isin(df.loc[df.Flag=='Y', 'Phone_number'].str.replace('\D+','')), 'Flag'] = 'Y' 

In [227]: df 
Out[227]: 
    Id Category Subcategory Count Flag Phone_number 
0 1  A   aa 4534 Y 222-444-3333 
1 2  B   bb 4807 Y 3335557777 
2 3  C   cc 8978 Y 222-444-3333 
3 4  D   dd 9874 Y 333-555-7777 
4 5  E   ee 3187  555-666-8888 
0

Sie pandas.merge unter der Telefonnummer Spalte in jedem Datenrahmen verwenden können: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

Sie können ein tun Outer Join und verwenden Sie dann die df.loc-Funktionalität, die Sie bereits kennen.

Stellen Sie sicher, dass Sie die Telefonnummern vor dem Join auf die gleiche Weise vorverarbeiten, damit sie das gleiche Format und den gleichen Datentyp aufweisen.

+0

Es tut mir leid - aber ich verstehe nicht, warum ich die zwei Dataframes zusammenführen würde, die ich gerade geteilt habe - ich muss eine Möglichkeit finden, die Telefonnummern in dem einen Datenrahmen an die Telefonnummern in dem anderen Datenrahmen – jeangelj

+0

anzupassen sie wieder zusammen und erstellen Sie einen neuen Datenrahmen, der die Telefonnummern in den beiden Datenrahmen übereinstimmt. – gaw89

Verwandte Themen