我有一个包含472列的数据框。其中99列是dxpoa1,dxpoa2,...,dxpoa99。我想过滤出dxpoa列'的数据帧的行。值只能是7或N或BLANK。 dxpoa可以有很多值,如Y,W,E,1,7或N等。或者它们仍然是BLANK。只有那些dxpoa只有7或N的行才能从数据帧中滤除。 数据集非常庞大,有数十万行。因此,将会有一种有效的方法。
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
我希望从数据框中删除第1,3,9行。
我尝试了很多方法:
df_col = [list of dxpoa column names]
df1 = df[df_col].isin(["Y", "W", "1", "E"]).values
它不会过滤掉。
答案 0 :(得分:2)
<强>更新强>
您可以使用NaN
,7
或N
替换空字符串,然后使用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
OLD回答:
显示包含7
或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
删除包含7
或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
如果您想要/排除所有列应包含any
或all
,请将7
替换为N
>
设置:
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
答案 1 :(得分:1)
df.filter(regex=r'^dxpoa')
选择名称以'dxpoa'
和.isin(['7','N','']).all(axis=1)
创建一个布尔掩码(对于行),当 all 时,行中的值为'7'
,'N'
为真,或空字符串''
:例如,
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])
产量
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
答案 2 :(得分:0)
使用申请。如果应用函数返回布尔值,则可以使用它来过滤行 比如下面的例子。请注意,我没有尝试重现您的过滤逻辑。
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), :]