我知道有类似的问题已被提出,但我发现的解决方案都没有奏效(我已在其中列出了部分问题)。
我有一个邮政编码列表,其中一些包含+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;对象不可迭代
以下是我看过的一些地方:
(对不起,如果我过度使用文档 - 我过去一直受到批评,并希望确保人们知道我一直在努力)
答案 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);