试图从混合型pd系列的邮政编码中删除+4

时间:2016-11-19 18:31:42

标签: python string pandas

我知道有类似的问题已被提出,但我发现的解决方案都没有奏效(我已在其中列出了部分问题)。

我有一个邮政编码列表,其中一些包含+4,我不需要。其他人要么太短(错别字),要么是外国人。目前,所有单元格都是对象。

示例可能是:

member  state   country     zip         joined
16081   NY  UNITED STATES   11215       9/4/09
21186   NY  UNITED STATES   5325        8/9/11
34999   NY  UNITED STATES   11218       11/4/16 
34999   NY  FOOBAR STATES   NaN         11/4/16 
5033    NY  UNITED STATES   11238-1630  11/7/16 
35079   NY  FOOBAR STATES   SW4 9JX     11/13/16    
35084   NY  UNITED STATES   11217-2181  11/14/16    

我想结束

member  state  country      zip         joined
16081   NY  UNITED STATES   11215       9/4/09
21186   NY  UNITED STATES   5325        8/9/11
34999   NY  UNITED STATES   11218       11/4/16 
34999   NY  FOOBAR STATES   NA          11/4/16 
5033    NY  UNITED STATES   11238       11/7/16 
35079   NY  FOOBAR STATES   SW4 9JX     11/13/16    
35084   NY  UNITED STATES   11217       11/14/16    

以下是我在编码方面尝试的一些事项:

for x in df.zip:
    if len(x) > 5:
        print x.split("-")[0]
        x[:x.index("-")]

返回TypeError:类型' float'的对象没有len()

df['zips'] = df['zip'].map(lambda x: x.rstrip('-'/n))

返回NameError:全局名称' n'未定义

def zipclip(x): 
    if x.isnumeric:
          if len(x) > 5:
              return z[:5]
          elif len(x) < 5:
              return "NA"

返回AttributeError:&#39; str&#39;对象没有属性&#39; isnumeric&#39;

df.zip = [line[:5] if line[:5].isnumeric() and line[6:].isnumeric() else\
line for line in zip if line]

返回TypeError:&#39; builtin_function_or_method&#39;对象不可迭代

以下是我看过的一些地方:

(对不起,如果我过度使用文档 - 我过去一直受到批评,并希望确保人们知道我一直在努力)

3 个答案:

答案 0 :(得分:1)

试试这个:

In [88]: df.zip = df.zip.str.split('-').str[0]

In [89]: df
Out[89]:
   member state        country      zip    joined
0   16081    NY  UNITED STATES    11215    9/4/09
1   21186    NY  UNITED STATES     5325    8/9/11
2   34999    NY  UNITED STATES    11218   11/4/16
3   34999    NY  FOOBAR STATES      NaN   11/4/16
4    5033    NY  UNITED STATES    11238   11/7/16
5   35079    NY  FOOBAR STATES  SW4 9JX  11/13/16
6   35084    NY  UNITED STATES    11217  11/14/16

答案 1 :(得分:0)

您可以点击zip列并将其转换为列表

df = pd.DataFrame({"zip": ['11215', '5325', '11218', np.nan, '11238-1630', 'SW4 9JX', '11217-2181']})

df['new_zip'] = [str(x).split('-')[0] if str(x) != 'nan' else 'NA' for x in df['zip']]

如果字符串中有split'-'方法只会“拆分”,否则将返回整个字符串本身。

结果:

>>> df
          zip  new_zip
0       11215    11215
1        5325     5325
2       11218    11218
3         NaN       NA
4  11238-1630    11238
5     SW4 9JX  SW4 9JX
6  11217-2181    11217

答案 2 :(得分:0)

我猜猜你们是以一种更加蟒蛇般正确的方式完成它(我将要检查出来)!但这对我有用(只需要将NaN改为字符串,&#34; NA&#34;):

df['zip'].fillna('NA', inplace=True)                   
def ziplist(x):
    if len(x) > 5:
        return x[0:4]
    else:
        return x

df['zip'] = df['zip'].apply(ziplist);