2016-05-05 18 views
2

Ich habe ein Datenframe, das 472 Spalten hat. Von diesen 99 Spalten sind dxpoa1, dxpoa2, ..., dxpoa99. Ich möchte Zeilen des Datenrahmens herausfiltern, in denen die Werte der dxpoa-Spalten entweder nur 7 oder N oder BLANK sind. dxpoa's können viele Werte haben wie Y, W, E, 1, 7, N usw. Oder sie bleiben BLANK. Nur diejenigen Zeilen, in denen dxpoa nur entweder 7 oder N haben, sollten aus dem Datenrahmen herausgefiltert werden. Dataset ist riesig mit vielen hunderttausend Zeilen. Daher wird eine effiziente Methode geschätzt.Filter pandas Datenrahmen basierend auf Werten in mehreren Spalten

a b c dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 0 A X  W  N  X  
1 Z W 2  7  7    
2 7 W N  W  W  1  Z 
3 1 7 E  N  N  N  N 
4 Y  0  W  N  X  1 
5 N X 1  E  1  Z  7 
6 1 X 7  0  A  W  A 
7 X X Z  X  N  A  1 
8 7 1 A  N  X  Z  N 
9 N A Z  N  N  N 
10 A N Z  7  0  A  E 
11 E N A  Z  N  N  1 
12 E A 1  Z  E  E  W 
13 N W Z  E  X  A  0 
14 Y 1 A  W  A  E  X 

Ich möchte Zeilennummer 1, 3, 9 aus Datarahmen entfernt.

Ich habe viele Möglichkeiten ausprobiert wie:

df_col = [list of dxpoa column names] 
df1 = df[df_col].isin(["Y", "W", "1", "E"]).values 

Es ist nicht ausfiltern.

+2

Haben Sie Reihen entfernen möchten, die jede * der dxpoa Spalten * enthalten ' '7'' oder'' N'' oder wollen Sie um nur die Zeilen zu entfernen, für die * alle * dieser Spalten "7" oder "N" enthalten? – unutbu

+0

Ich möchte nur die Zeilen entfernen, für die einige oder alle dieser Spalten '7' oder 'N' enthalten können. Wenn Zeilen eine Mischung aus 7, N, E, W usw. oder anders als 7, N haben, möchte ich diese Zeilen behalten. In der ersten Zeile habe ich "etwas" geschrieben, da es nicht notwendig ist, dass alle dxpoa-Spalten Werte haben. Viele Spalten sind auch Leerzeichen. Diese Spalten sind Platzhalter für Werte. In einigen Zeilen haben nur 1 oder 2 Werte, während in einigen alle Werte Werte haben. – Sanoj

+0

Es ist besser, sich Leerzeichen als leere Strings vorzustellen, '' '' - ein Wert wie '' 7'' oder '' N''. Dann können Sie das Problem so ausdrücken, als würden Sie Zeilen entfernen, für die * alle * die Werte (in den dxpoa-Spalten) in '['7', 'N', '']' stehen. – unutbu

Antwort

2

UPDATE:

Sie leere Strings mit NaN ersetzen kann, 7 oder N und verwenden Sie dann isin:

In [196]: df[~df[cols].replace('',np.nan).isin(['7','N', np.nan]).all(axis=1)] 
Out[196]: 
    a b c dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 0 A X  W  N  X 
2 7 W N  W  W  1  Z 
4 Y 0 W  N  X  1 
5 N X 1  E  1  Z  7 
6 1 X 7  0  A  W  A 
7 X X Z  X  N  A  1 
8 7 1 A  N  X  Z  N 
10 A N Z  7  0  A  E 
11 E N A  Z  N  N  1 
12 E A 1  Z  E  E  W 
13 N W Z  E  X  A  0 
14 Y 1 A  W  A  E  X 

ALTE Antwort:

zeigen solche, die 7 oder N

In [197]: df.loc[df[cols].isin(['7','N']).any(axis=1)] 
Out[197]: 
    a b c dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 0 A X  W  N  X 
1 Z W 2  7  7 
3 1 7 E  N  N  N  N 
4 Y 0 W  N  X  1 
5 N X 1  E  1  Z  7 
7 X X Z  X  N  A  1 
8 7 1 A  N  X  Z  N 
9 N A Z  N  N  N 
10 A N Z  7  0  A  E 
11 E N A  Z  N  N  1 

solche mit 7 oder N

In [198]: df.loc[~df[cols].isin(['7','N']).any(axis=1)] 
Out[198]: 
    a b c dxpoa1 dxpoa2 dxpoa3 dxpoa4 
2 7 W N  W  W  1  Z 
6 1 X 7  0  A  W  A 
12 E A 1  Z  E  E  W 
13 N W Z  E  X  A  0 
14 Y 1 A  W  A  E  X 

ersetzen any-all entfernen, wenn Sie haben wollen/ausschließen solche, bei denen alle Spalten enthalten sollte entweder 7 oder N

Setup:

rows = 15 

s = [''] + list('YWE17N0AZX') 
df = pd.DataFrame(np.random.choice(s, size=(rows, 7)), columns=list('abc') + ['dxpoa1', 'dxpoa2', 'dxpoa3', 'dxpoa4']) 

cols = df.filter(like='dxpoa').columns 
+0

Es entfernt alle Zeilen, in denen 7 oder N zusammen mit anderen Werten auftritt. Ich möchte nur die Zeilen, in denen nur 7 oder N vorkommt, entfernt werden – Sanoj

+0

@Sanoj, hat meine aktualisierte Antwort geholfen? – MaxU

+0

Vielen Dank. Es klappt. – Sanoj

0

Verwendung gelten. Wenn die angewandte Funktion einen booleschen Wert zurückgibt, kann sie verwendet werden, um die Zeilen wie im folgenden Beispiel zu filtern. Beachten Sie, dass ich nicht versucht habe, Ihre Filterlogik zu reproduzieren.

def analyze_row(r): 
    # do whatever you want with column values here 
    # return boolean: True - row stays, False - row gone 
    ret = False 
    if r['dpxoa1'] == 'W': 
     ret = True 
    return ret 

filtered_df = df.ix[df.apply(analyze_row, axis = 1), :] 
1
  • Sie df.filter(regex=r'^dxpoa') Spalten auswählen verwenden könnte, dessen Name beginnt mit 'dxpoa' und
  • Verwendung .isin(['7','N','']).all(axis=1) eine boolean Maske erstellen (für die Zeilen), die wahr ist, wenn alle die Werte in der Zeile sind entweder '7', 'N' oder die leere Zeichenkette, '':

Zum Beispiel

import pandas as pd 

df = pd.DataFrame(
    {'a': ['0','Z','7','1','Y','N','1','X','7','N','A','E','E','N','Y'], 
    'b': ['A','W','W','7','','X','X','X','1','A','N','N','A','W','1'], 
    'c': ['X','2','N','E','0','1','7','Z','A','Z','Z','A','1','Z','A'], 
    'dxpoa1': ['W','7','W','N','W','E','0','X','N','N','7','Z','Z','E','W'], 
    'dxpoa2': ['N','7','W','N','N','1','A','N','X','N','0','N','E','X','A'], 
    'dxpoa3': ['X','','1','N','X','Z','W','A','Z','N','A','N','E','A','E'], 
    'dxpoa4': ['','','Z','N','1','7','A','1','N','','E','1','W','0','X']}) 
mask = df.filter(regex=r'^dxpoa').isin(['7','N','']).all(axis=1) 
print(df.loc[~mask]) 

Ausbeuten

a b c dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 0 A X  W  N  X  
2 7 W N  W  W  1  Z 
4 Y  0  W  N  X  1 
5 N X 1  E  1  Z  7 
6 1 X 7  0  A  W  A 
7 X X Z  X  N  A  1 
8 7 1 A  N  X  Z  N 
10 A N Z  7  0  A  E 
11 E N A  Z  N  N  1 
12 E A 1  Z  E  E  W 
13 N W Z  E  X  A  0 
14 Y 1 A  W  A  E  X 
Verwandte Themen