2017-02-28 2 views
0

Ich hatte Schwierigkeiten, den bestimmten Python-Befehl für mein Szenario zu finden.Python - trimmen Spalten nach einem bestimmten Zeichen oder Sequenz

Ich möchte Datasets basierend auf Gen-Namen zusammenführen. (ex/F44E5.4) Für die meisten Gennamen gibt es eine 100% Übereinstimmung, also kein Problem. Für andere Gene gibt es Varianten, die entweder mit. #, Einem Kleinbuchstabenvokal oder beiden am Ende des Genamens base bezeichnet werden. (ex/F26D10.3.2, K01G5.8b, F52D10.3a.2).

Ich möchte diese zusätzlichen Bits von Informationen trimmen, um mit meinem anderen Datensatz zu verschmelzen.

Auch wenn es Varianten gibt würde ich gerne den höheren Buchstaben oder die # Variante wählen. (Dh/a über b oder 0,1 über .2)

df1 
    gene_name v_1 
1 F44E5.4  1 
2 F26D10.3.2 2 
3 K01G5.8b  3 
4 F52D10.3a.2 2 
5 K52GGG.1.1 2 
6 K52GGG.1.2 4 

df2 
    gene_name v_2 
1 F44E5.4  .4 
2 F26D10.3  .4 
3 K01G5.8  .6 
4 F52D10.3a .7 
5 K52GGG.1  .4 


merge 
    gene_name v_1  v_2 
1 F44E5.4  1  .4 
2 F26D10.3  2  .4 
3 K01G5.8  3  .6 
4 F52D10.3  2  .7 
5 K52GGG.1  2  .4 

Antwort

1

Sie diesen Ansatz verwenden:

In [25]: a.drop('gene_name',1) \ 
    ...: .groupby(a.gene_name.str.extract(r'([^\.]*\.\d*)', expand=False)) \ 
    ...: .max() \ 
    ...: .join(b.drop('gene_name',1) 
    ...:   .groupby(b.gene_name.str.extract(r'([^\.]*\.\d*)', expand=False)) 
    ...:   .max()) \ 
    ...: .reset_index() 
    ...: 
Out[25]: 
    gene_name v_1 v_2 
0 F26D10.3 2 0.4 
1 F44E5.4 1 0.4 
2 F52D10.3 2 0.7 
3 K01G5.8 3 0.6 
4 K52GGG.1 4 0.4 

Oder mit pd.merge() Methode:

In [26]: pd.merge(
    ...:  a.drop('gene_name',1) 
    ...:  .groupby(a.gene_name.str.extract(r'([^\.]*\.\d*)', expand=False)) 
    ...:  .max(), 
    ...:  b.drop('gene_name',1) 
    ...:  .groupby(a.gene_name.str.extract(r'([^\.]*\.\d*)', expand=False)) 
    ...:  .max(), 
    ...:  left_index=True, 
    ...:  right_index=True 
    ...:).reset_index() 
    ...: 
Out[26]: 
    gene_name v_1 v_2 
0 F26D10.3 2 0.4 
1 F44E5.4 1 0.4 
2 F52D10.3 2 0.7 
3 K01G5.8 3 0.6 
4 K52GGG.1 4 0.4 

PS I verwendet a und b anstelle von df1 und df2, um es etwas kürzer zu machen ...

Verwandte Themen