我有一个带邮政编码的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
错误。谁能给我一些有关我要完成的事情的建议?
答案 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