根据Python中的浮点长度删除行

时间:2018-11-26 02:33:11

标签: python-3.x pandas dataframe subset

我有一个带邮政编码的DataFrame等。数据示例如下:

     Zip    Item1     Item2   Item3
 78264.0      pan  elephant    blue
 73909.0  steamer     panda  yellow
  2602.0      pot     rhino  orange
 59661.0     fork     zebra   green
861893.0     sink    ocelot     red
 77892.0  spatula    doggie   brown

其中一些邮政编码无效,数字太多或太少。我正在尝试删除无效的字符/数字行(在这种情况下为七个字符,因为我正在根据str()检查长度,并且其中包含.0)。以下lengths循环:

zips = mydata.iloc[:,0].astype(str)
lengths = []
for i in zips:
    lengths.append(len(i))

为每一行产生一个系列的邮政编码字符长度(不要与Series混淆,尽管它是-我是Python的新手)。然后,我尝试根据lengths变量中的信息对DataFrame进行子集化。我尝试了几种不同的方法。以下是最新版本:

for i in lengths.index(i):
    if mydata.iloc[i:,0] != 7:
        mydata.iloc[i:,0].drop()

自然地,此操作失败,并显示一个ValueError: '44114.0' is not in list错误。谁能给我一些有关我要完成的事情的建议?

3 个答案:

答案 0 :(得分:1)

使用str.len

df[df.iloc[:,0].astype(str).str.len()!=7]
          A
1  1.222222
2  1.222200

dput:

df=pd.DataFrame({'A':[1.22222,1.222222,1.2222]})

答案 1 :(得分:1)

您可以使用Pandas过滤而不是循环和ifs更简洁地编写此代码。

这里是一个例子:

valid_zips = mydata[mydata.astype(str).str.len() == 7]

zip_code_upper_bound = 100000
valid_zips = mydata[mydata < zip_code_upper_bound]
假设小数不包含在您的集合中。请注意,第一个示例将删除较短的zip,而第二个示例会将其保留在其中,因为它们可能有前导零,所以您可能希望这么做。

示例输出:

df被定义为(根据您的示例):

        Zip    Item1     Item2   Item3
0   78264.0      pan  elephant    blue
1   73909.0  steamer     panda  yellow
2    2602.0      pot     rhino  orange
3   59661.0     fork     zebra   green
4  861893.0     sink    ocelot     red
5   77892.0  spatula    doggie   brown

使用以下代码:

df[df.Zip.astype(str).str.len() == 7]

结果是:

       Zip    Item1     Item2   Item3
0  78264.0      pan  elephant    blue
1  73909.0  steamer     panda  yellow
3  59661.0     fork     zebra   green
5  77892.0  spatula    doggie   brown

答案 2 :(得分:0)

看看是否可行

df1 = df['ZipCode'].astype(str).map(len)==5