Python 基于列值删除熊猫中的数据帧行
我有以下数据帧:Python 基于列值删除熊猫中的数据帧行,python,pandas,Python,Pandas,我有以下数据帧: daysago line_race rating rw wrating line_date 2007-03-31 62 11 56 1.000000 56.000000 2007-03-10 83 11 67 1.000000 67.000000
daysago line_race rating rw wrating
line_date
2007-03-31 62 11 56 1.000000 56.000000
2007-03-10 83 11 67 1.000000 67.000000
2007-02-10 111 9 66 1.000000 66.000000
2007-01-13 139 10 83 0.880678 73.096278
2006-12-23 160 10 88 0.793033 69.786942
2006-11-09 204 9 52 0.636655 33.106077
2006-10-22 222 8 66 0.581946 38.408408
2006-09-29 245 9 70 0.518825 36.317752
2006-09-16 258 11 68 0.486226 33.063381
2006-08-30 275 8 72 0.446667 32.160051
2006-02-11 475 5 65 0.164591 10.698423
2006-01-13 504 0 70 0.142409 9.968634
2006-01-02 515 0 64 0.134800 8.627219
2005-12-06 542 0 70 0.117803 8.246238
2005-11-29 549 0 70 0.113758 7.963072
2005-11-22 556 0 -1 0.109852 -0.109852
2005-11-01 577 0 -1 0.098919 -0.098919
2005-10-20 589 0 -1 0.093168 -0.093168
2005-09-27 612 0 -1 0.083063 -0.083063
2005-09-07 632 0 -1 0.075171 -0.075171
2005-06-12 719 0 69 0.048690 3.359623
2005-05-29 733 0 -1 0.045404 -0.045404
2005-05-02 760 0 -1 0.039679 -0.039679
2005-04-02 790 0 -1 0.034160 -0.034160
2005-03-13 810 0 -1 0.030915 -0.030915
2004-11-09 934 0 -1 0.016647 -0.016647
我需要删除
line\u race
等于0
的行。做这件事最有效的方法是什么?如果我理解正确,应该简单到:
df = df[df.line_race != 0]
最好的方法是使用布尔掩蔽:
In [56]: df
Out[56]:
line_date daysago line_race rating raw wrating
0 2007-03-31 62 11 56 1.000 56.000
1 2007-03-10 83 11 67 1.000 67.000
2 2007-02-10 111 9 66 1.000 66.000
3 2007-01-13 139 10 83 0.881 73.096
4 2006-12-23 160 10 88 0.793 69.787
5 2006-11-09 204 9 52 0.637 33.106
6 2006-10-22 222 8 66 0.582 38.408
7 2006-09-29 245 9 70 0.519 36.318
8 2006-09-16 258 11 68 0.486 33.063
9 2006-08-30 275 8 72 0.447 32.160
10 2006-02-11 475 5 65 0.165 10.698
11 2006-01-13 504 0 70 0.142 9.969
12 2006-01-02 515 0 64 0.135 8.627
13 2005-12-06 542 0 70 0.118 8.246
14 2005-11-29 549 0 70 0.114 7.963
15 2005-11-22 556 0 -1 0.110 -0.110
16 2005-11-01 577 0 -1 0.099 -0.099
17 2005-10-20 589 0 -1 0.093 -0.093
18 2005-09-27 612 0 -1 0.083 -0.083
19 2005-09-07 632 0 -1 0.075 -0.075
20 2005-06-12 719 0 69 0.049 3.360
21 2005-05-29 733 0 -1 0.045 -0.045
22 2005-05-02 760 0 -1 0.040 -0.040
23 2005-04-02 790 0 -1 0.034 -0.034
24 2005-03-13 810 0 -1 0.031 -0.031
25 2004-11-09 934 0 -1 0.017 -0.017
In [57]: df[df.line_race != 0]
Out[57]:
line_date daysago line_race rating raw wrating
0 2007-03-31 62 11 56 1.000 56.000
1 2007-03-10 83 11 67 1.000 67.000
2 2007-02-10 111 9 66 1.000 66.000
3 2007-01-13 139 10 83 0.881 73.096
4 2006-12-23 160 10 88 0.793 69.787
5 2006-11-09 204 9 52 0.637 33.106
6 2006-10-22 222 8 66 0.582 38.408
7 2006-09-29 245 9 70 0.519 36.318
8 2006-09-16 258 11 68 0.486 33.063
9 2006-08-30 275 8 72 0.447 32.160
10 2006-02-11 475 5 65 0.165 10.698
更新:现在熊猫0.13已经发布,另一种方法是
df.query('line\u race!=0')
但是对于任何未来的旁路,您可以提到,df=df[df.line\u race!=0]
在尝试筛选无缺失值时不会做任何事情
是否有效:
df = df[df.line_race != 0]
df = df[df.line_race.notnull()]
什么都不做:
df = df[df.line_race != None]
是否有效:
df = df[df.line_race != 0]
df = df[df.line_race.notnull()]
给出的答案是正确的,正如上面有人所说,您可以使用df.query('line\u race!=0')
,这取决于您的问题,速度要快得多。强烈推荐。只需添加另一个解决方案,特别是在您使用新的pandas评估器时,其他解决方案将替换原来的pandas并失去评估器
df.drop(df.loc[df['line_race']==0].index, inplace=True)
另一种方法。可能不是最有效的方法,因为代码看起来比其他答案中提到的代码复杂一点,但仍然是做同样事情的替代方法
df = df.drop(df[df['line_race']==0].index)
虽然前面的答案与我将要做的几乎相似,但使用index方法并不需要使用另一个索引方法。loc()。这可以用类似但精确的方式来完成
df.drop(df.index[df['line_race'] == 0], inplace = True)
如果要基于列的多个值删除行,可以使用:
df[(df.line_race != 0) & (df.line_race != 10)]
要删除所有值为0和10的行,只需为扩展到所有列的数据帧添加另一种方式:
for column in df.columns:
df = df[df[column]!=0]
例如:
def z_score(data,count):
threshold=3
for column in data.columns:
mean = np.mean(data[column])
std = np.std(data[column])
for i in data[column]:
zscore = (i-mean)/std
if(np.abs(zscore)>threshold):
count=count+1
data = data[data[column]!=i]
return data,count
我编译并运行我的代码。这是准确的代码。你可以自己试试
data = pd.read_excel('file.xlsx')
如果列名中有任何特殊字符或空格,可以将其写入'
中,就像在给定代码中一样:
data = data[data['expire/t'].notnull()]
print (date)
如果只有一个字符串列名,没有任何空格或特殊字符
你可以直接访问它
data = data[data.expire ! = 0]
print (date)
如果有多个值和str数据类型
我使用以下方法过滤列中的给定值:
def filter_rows_by_values(df, col, values):
return df[df[col].isin(values) == False]
例如:
def z_score(data,count):
threshold=3
for column in data.columns:
mean = np.mean(data[column])
std = np.std(data[column])
for i in data[column]:
zscore = (i-mean)/std
if(np.abs(zscore)>threshold):
count=count+1
data = data[data[column]!=i]
return data,count
在数据帧中,我想删除列“str”中值为“b”和“c”的行
增加一种方法来实现这一点
df = df.query("line_race!=0")
其中一种有效且全面的方法是使用eq()
方法:
df[~df.line_race.eq(0)]
查询看起来非常有用!谢谢查询的良好更新
。它允许更丰富的选择标准(例如,类似set的操作,如df.query('variable in var_list')
,其中'var_list'是所需值的列表)如果列名中有空格,这将如何实现?query
如果列名中有空格,则不太有用。如果df=df.rename(columns=lambda x:x.strip().replace('','')
,如果df
很大,这会占用更多内存吗?或者,我可以就地执行吗?只需在一个有2M行的df
上运行,运行速度非常快。@vfxGer如果列中有空格,如“line race”,则可以执行df=df[df['line race'!=0]
如果要删除整行(如果在该行的任何列中发现有问题的值),我们将如何修改此命令?谢谢!Fwiw,对我来说,这必须是df=df[~df['DATE'].isin(['2015-10-30.1','2015-11-30.1','2015-12-31.1'])
如果你有像我这样的长DataFrame
变量名(并且,我冒昧地猜测,与示例中使用的df
相比,每个人都有可能是重复的),这一点特别有用,因为你只需要写一次。如果我们不知道列名怎么做?可以做df=df[df.columns[2].notnull()]
,但无论如何,你需要能够以某种方式索引列。df=df[df.line\u race!=0]
删除行,但也不会重置索引。因此,当您在df中添加另一行时,它可能不会在末尾添加。我建议在该操作之后重置索引(df=df.reset_index(drop=True)
),您永远不要将=
操作符与None进行比较。对于None
值,您可以使用is
代替=
,不是代替=代码>,如本例中的df=df[df.line\u race不是None]
将起作用写入索引和替换的目的是什么。有人能解释一下吗?我想如果有人最终使用索引访问器,我们也需要.reset_index()
,这样对大型数据集或内存受限的情况更好+1如果您有多个要删除的值,例如,drop=[0,10]
然后是类似于df[(df.line\u race!=drop)]
的建议,有没有更有效的方法来执行此操作df[(df.line\u race!=drop)]
不起作用,但我想有可能做得更有效。我现在没有解决方案,但是如果有人有,请现在就告诉我们。df[~(df[“line_race”].isin([0,10])如果您需要任何其他帮助,我在这里。这是一个非常有用的小函数。谢谢。我也喜欢这个。可能已经完全过时,但添加了一个小参数,可以帮助我决定是选择还是删除它。如果要将df一分为二,请使用此工具:def filter_rows_by_value(df,col,values,true或false=false):返回df[df[col].isin(values)==true或false]