【问题标题】:Drop rows based on float length in Python在 Python 中根据浮点长度删除行
【发布时间】:2019-04-27 16:22:04
【问题描述】:

我有一个带有邮政编码的 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))

为每行生成一个邮政编码字符长度的系列(不要与系列混淆,尽管它可能是——我是 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 开头(这对邮政编码有效),但那些前导 0 会被浮点数丢弃
  • 你可以发布你的数据的sn-p吗
  • 正确。这是我在分析中考虑的一部分。这就是我接收数据的方式,也是我现在需要修复它的部分原因。数据已损坏,但它就是它的本来面目。

标签: python-3.x pandas dataframe subset


【解决方案1】:

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

这是一个例子:

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

【讨论】:

  • 我一直在R中做这些索引函数,但是我对Python的索引函数还不够熟悉。我将来会多次引用这个问题。在哪里可以找到 Python 括号索引和切片的文档?
  • 切片表示法是使用 .where 的简写,它接受相同形状的布尔系列并返回系列为 True 的行,您可以将其视为获取条件(括号内)为真。这是关于在 Pandas 中索引和选择的长页面:pandas.pydata.org/pandas-docs/stable/indexing.html
【解决方案2】:

使用str.len

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

输入:

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

【讨论】:

    【解决方案3】:

    看看有没有效果

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

    【讨论】:

      猜你喜欢
      • 2014-06-18
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多