2016-05-12 14 views
0

Ich habe einen Datenrahmen, der wie folgt aussieht:Finde äquivalente Reihen in Pandas?

df = pd.DataFrame([ 
    {'code': '0101010C0AAAAAA', 'chemical': '0101010C0', 'is_generic': True, 'format': 'AAAA'}, 
    {'code': '0101010C0BBAAAA', 'chemical': '0101010C0', 'is_generic': False, 'format': 'AAAA'}, 
    {'code': '0101010F0AAAUAU', 'chemical': '0101010F0', 'is_generic': True, 'format': 'AUAU'}, 
    {'code': '0101010F0BCAAAU', 'chemical': '0101010F0', 'is_generic': False, 'format': 'AAAU'}, 
    {'code': '0101010G0AAABAB', 'chemical': '0101010G0', 'is_generic': False, 'format': 'ABAB'} 
]) 
        code chemical is_generic format 
0  0101010C0AAAAAA 0101010C0  True AAAA 
1  0101010C0BBAAAA 0101010C0  False AAAA 
2  0101010F0AAAUAU 0101010F0  True AUAU 
3  0101010F0BCAAAU 0101010F0  False AAAU 
4  0101010G0AAABAB 0101010G0  False ABAB 

Ich mag würde einen neuen Datenrahmen mit einer Zeile für jeden Code erstellen, in den is_generic falsch ist. Dann würde Ich mag eine Spalte hinzuzufügen, die für jeden Code ist der Code mit dem gleichen chemischen und Format, für die aber is_generic ist True:

  code  generic_equiv 
0101010C0BBAAAA  0101010C0AAAAAA 
0101010F0BCAAAU  0101010F0AAAUAU 
0101010G0AAABAB  None 

Ich weiß, wie für jeden den Datenrahmen mit einer Reihe zu bekommen Code wo is_generic ist falsch:

df1 = df[df['is_generic'] == True] 

ich glaube, ich möchte eine bedingte merge mit df zu tun, aber, wie dies zu tun? Hier

+0

Gibt es höchstens eine generic = True Zeile jede Anpassung sein garantiert insbesondere generisch = Falsche Zeile? Oder könnte es mehrere Generika für ein Nicht-Generikum geben? Wenn es mehrere geben könnte, wie würde die Ausgabe aussehen? –

+0

@JohnZwinck danke! Ja, es gibt höchstens eins. – Richard

Antwort

3

...

df = pd.DataFrame([ 
    {'code': '0101010C0AAAAAA', 'chemical': '0101010C0', 'is_generic': True, 'format': 'AAAA'}, 
    {'code': '0101010C0BBAAAA', 'chemical': '0101010C0', 'is_generic': False, 'format': 'AAAA'}, 
    {'code': '0101010F0AAAUAU', 'chemical': '0101010F0', 'is_generic': True, 'format': 'AUAU'}, 
    {'code': '0101010F0BCAAAU', 'chemical': '0101010F0', 'is_generic': False, 'format': 'AAAU'}, 
    {'code': '0101010G0AAABAB', 'chemical': '0101010G0', 'is_generic': False, 'format': 'ABAB'} 
]) 

groups = df.groupby('is_generic') 
pd.merge(groups.get_group(False), groups.get_group(True), on='chemical', how='left') 

Ausgang ...

chemical   code_x format_x is_generic_x   code_y format_y \ 
0 0101010C0 0101010C0BBAAAA  AAAA  False 0101010C0AAAAAA  AAAA 
1 0101010F0 0101010F0BCAAAU  AAAU  False 0101010F0AAAUAU  AUAU 
2 0101010G0 0101010G0AAABAB  ABAB  False    NaN  NaN 

    is_generic_y 
0   True 
1   True 
2   NaN 

Subset/umbenennen Spalten, wie Sie möchten.

+0

Danke - das scheint zu funktionieren! Ich habe 'on = ['chemical', 'format']' gefunden, um auf beide Spalten zu passen. – Richard

0

einen neuen Datenrahmen Stellen, wo nur die falsche, die 2 neue Datenrahmen vorhanden und fusionieren sind seperat

df1 = df[df['is_generic'] == True] 
df2 = df[df['is_generic'] == False] 
df3 = pd.merge(df1[['chemical','code']],df2[['chemical','code']],left_on='chemical',right_on='chemical',how='right') 
del df3['chemical'] 
df3.rename(columns={'code_x':'generic_equiv','code_y':'code'},inplace=True) 

Ausgang:

generic_equiv    code 
0 0101010C0AAAAAA 0101010C0BBAAAA 
1 0101010F0AAAUAU 0101010F0BCAAAU 
2    NaN 0101010G0AAABAB 
+0

Danke, aber ich muss sowohl auf chemische und Format übereinstimmen ... – Richard

Verwandte Themen