【问题标题】:Clean way to properly check if phone number is not false in df正确检查电话号码在df中是否为假的干净方法
【发布时间】:2019-02-01 16:31:29
【问题描述】:

假设我有一个看起来像这样的数据框

id  phone_number  
0   5555555555
1   9082345324
2   2345098345

我想运行一个单行或干净的说法:

  • 如果号码的位数全部相同,请将其删除

输出应如下所示:

id  phone_number  
1   9082345324
2   2345098345

我的方法是使用iterrows(),并将每个电话号码的每个数字放入一个列表中,然后使用lst[1:] == lst[:-1] 交叉比较列表以查看所有数字是否相同。如果是,请从 DF 中删除该行。我只想要一个更干净的解决方案

【问题讨论】:

  • 你能告诉我们你的尝试吗? SO 并不是真正意义上的代码编写服务,我们在这里帮助您找出您自己的代码存在的问题。
  • 电话号码总是10位数吗?
  • 电话号码始终为 10 位数字。我不是在寻找代码帮助,我有它的工作。我只是想要一个更清洁的解决方案或更清洁的解决方案的想法。
  • 如果你有它工作为什么不给我们看代码?
  • 我只是想要一个更清洁的解决方案或更清洁的解决方案的想法我们如何在不知道基线是什么的情况下推荐更好的东西?

标签: python pandas dataframe


【解决方案1】:

您可以使用set 并检查长度

df[df.phone_number.apply(set).str.len().gt(1)]

  id phone_number
1  1   9082345324
2  2   2345098345

使用理解等价

df[[len({*x}) > 1 for x in df.phone_number]]

如果这些是实际整数

df[df.phone_number.astype(str).apply(set).str.len().gt(1)]
# df[[len({*str(x)}) > 1 for x in df.phone_number]]

假设其中可能有非数字,进一步验证

df[df.phone_number.astype(str).replace('\D', '').apply(set).str.len().gt(1)]

【讨论】:

    【解决方案2】:

    首先,将电话号码转换为字符串(如果还没有的话)。然后,您需要检查电话号码中第一个character 的出现次数。如果这与电话号码的长度相匹配,则应删除该记录。

    df.phone_number = df.phone_number.apply(str)
    df = df.loc[~df['phone_number'].apply(lambda x: x.count(x[0]) == len(x))]
    

    输出:

    id  phone_number
    1   1   9082345324
    2   2   2345098345
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2020-02-27
      • 2017-10-17
      • 2021-11-24
      • 2011-09-07
      相关资源
      最近更新 更多