【问题标题】:How to filter and keep only 6 digit number in a dataframe column [duplicate]如何在数据框列中过滤并仅保留 6 位数字[重复]
【发布时间】:2018-01-26 15:57:56
【问题描述】:

我有数据框列。我只需要保留 6 位数字,所有其他数字都应命名为“无效”

输入

data['Post_Code'] 
629785
588778
760-\63
76063
76063
S4P2Z6
NP443HO
999999999
8
4
3
3
460803
460803
460803
760439
569139
ABVCD

预期输出

data['Cleaned_Post_Code']
629785
588778
Nil
Nil
Nil
Nil
Nil
Nil
Nil
Nil
Nil
Nil
460803
460803
460803
760439
569139
Nil

如何做到这一点。

【问题讨论】:

  • "应该被命名为 'Not Valid'" - 那么为什么在你的例子中它们被称为“Nil”呢?
  • 与其替换为字符串“Nil”,不如使用更通用的值,例如NoneNaN。这样以后会轻松很多

标签: python regex pandas


【解决方案1】:

您可以通过正则表达式使用str.extract - ^ 用于字符串开头,\d{6} 用于6 digits 和$ 用于字符串结尾:

data['Cleaned_Post_Code'] = data['Post_Code'].str.extract('^(\d{6})$', expand=False)
print (data)
    Post_Code Cleaned_Post_Code
0      629785            629785
1      588778            588778
2       760-3               NaN
3       76063               NaN
4       76063               NaN
5      S4P2Z6               NaN
6     NP443HO               NaN
7   999999999               NaN
8           8               NaN
9           4               NaN
10          3               NaN
11          3               NaN
12     460803            460803
13     460803            460803
14     460803            460803
15     760439            760439
16     569139            569139
17      ABVCD               NaN

如果要替换NaNs 添加fillna:

data['Cleaned_Post_Code'] = (data['Post_Code'].str.extract('^(\d{6})$', expand=False)
                                              .fillna('Nill'))
print (data)
    Post_Code Cleaned_Post_Code
0      629785            629785
1      588778            588778
2       760-3              Nill
3       76063              Nill
4       76063              Nill
5      S4P2Z6              Nill
6     NP443HO              Nill
7   999999999              Nill
8           8              Nill
9           4              Nill
10          3              Nill
11          3              Nill
12     460803            460803
13     460803            460803
14     460803            460803
15     760439            760439
16     569139            569139
17      ABVCD              Nill

【讨论】:

  • 投反对票的人,如果这个答案有问题,请让这个用户知道,以便他们修复它。
  • @jezrael,它不能正常工作,它仍然保留 5 位数字,所有其他数字都被过滤
  • @Rahulrajan - 数据似乎有些问题 - 是否可以使用 print(data['Post_Code'].head(20).tolist()) 创建更好的样本?
  • 输出:['629785','588778','76063','76063','76063','651289','651289','764502','169038','540113' , '048622', '682485', '320017', '460803', '460803', '460803', '760439', '569139', '510547', '683684', '228213', '140118', ' 380018'、'389730'、'759152'、'416352'、'127370'、'520405'、'560208'、'538473']
  • 我用data = pd.DataFrame({'Post_Code': ['629785', '588778', '76063', '76063', '76063', '651289', '651289', '764502', '169038', '540113', '048622', '682485', '320017', '460803', '460803', '460803', '760439', '569139', '510547', '683684', '228213', '140118', '380018', '389730', '759152', '416352', '127370', '520405', '560208', '538473'] }) 测试我的解决方案,行2,3,4 有3 次NaN。你得到相同的输出吗?
【解决方案2】:
data['Cleaned_Post_Code'] = np.where((data['Post_Code'].str.len()==6)\
                                    &(data['Post_Code'].str.isdigit()), 
                                     data['Post_Code'], 'Nil')

【讨论】:

  • 请附上您的代码的简短说明。您还应该鼓励提出问题的人尝试自己解决问题。对此已经有了更好的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多