如果其中一列中有字符串,我们如何根据多个条件对数据帧进行数字过滤



我试图根据两个条件过滤数据帧。

  1. 筛选名为"计数"的字段所在的项>30…和
  2. 过滤名为"LAND SQUARE FEET"的字段<5000

这是我尝试过的代码,但我出现了错误,否则我不会在这里发布。

df.loc[(df['Count']>=30) & (df['LAND SQUARE FEET']< 5000)['Count','LAND SQUARE FEET']]
df[df.eval("Count>=30 & (LAND SQUARE FEET <5000).values")]

我怎样才能让它发挥作用?

df[(df["Count"] >= 30) & (df["LAND SQUARE FEET"] < 5000)]

具体来说,错误(请参阅其他答案的注释(现在表示列中的某个值中有一个-,您可以使用下面的解决方案,也可以执行df["LAND SQUARE FEET"] = df["LAND SQUARE FEET"] =.replace('-','').astype(int)。但是,可能还有其他字符串需要替换,这可能意味着如果有更多的字符串,而不是-,例如,ft.,您会一直看到错误。此外,带有-的那一行可能完全是坏数据,因为我不确定为什么-会是一个应该是平方英尺整数的数字。

此外,您可以专门用df[df["LAND SQUARE FEET"].str.contains('-')查看这一行,然后决定要用它做什么——用replace处理它的数据,或者用pd.to_numeric()使它成为NaN


pd.to_numeric()解决方案

您需要首先使用pd.to_numeric(),因为您的列中有字符串,并将errors='coerce'更改传递给那些字符串值的NaN。如果调用df.info():,那么列的数据类型现在应该是float

步骤1:

df = pd.DataFrame({"LAND SQUARE FEET" : [4500, '4,400 feet', '4,600', 4700, 5500, 6000],
"Count" : [45,55,65,75,15,25]})
df
Out[1]: 
LAND SQUARE FEET  Count
0             4500     45
1       4,400 feet     55
2            4,600     65
3             4700     75
4             5500     15
5             6000     25

步骤2:

df = pd.DataFrame({"LAND SQUARE FEET" : [4500, '4,400 feet', '4,600', 4700, 5500, 6000],
"Count" : [45,55,65,75,15,25]})
df["LAND SQUARE FEET"] = pd.to_numeric(df["LAND SQUARE FEET"], errors='coerce')
df
Out[2]: 
LAND SQUARE FEET  Count
0            4500.0     45
1               NaN     55
2               NaN     65
3            4700.0     75
4            5500.0     15
5            6000.0     25

步骤3(以及最终输出(:

df = pd.DataFrame({"LAND SQUARE FEET" : [4500, '4,400 feet', '4,600', 4700, 5500, 6000],
"Count" : [45,55,65,75,15,25]})
df["LAND SQUARE FEET"] = pd.to_numeric(df["LAND SQUARE FEET"], errors='coerce')
new_df = df.loc[(df['Count']>=30) & (df['LAND SQUARE FEET']< 5000),['Count','LAND SQUARE FEET']]
new_df
Out[3]: 
Count  LAND SQUARE FEET
0     45            4500.0
3     75            4700.0

最新更新