我在Python里有一个df(数据框架),其中有一个postal_code变量,里面有加拿大的邮政编码。所有的邮政编码都被收集在一行中,比如k1b6j2。但是,对于我来说,我需要使用'PGEOCODE'包,我需要标准形式的邮政编码,比如k1b 6j2 (第3和第4个字符之间必须有一个空格)
那么,有没有办法在df中用修改后的邮政编码来代替所有的邮政编码呢?
非常感谢,Ben
你可以简单地重新定义你所期望的列的格式。
import pandas as pd
df = pd.DataFrame({'ID':[1,2,3,4],'postal_code':['k1b6j2','k1b6j3','k1b6j4','k1b6j5']}) ##Example dataset
ID postal_code
0 1 k1b6j2
1 2 k1b6j3
2 3 k1b6j4
3 4 k1b6j5
重新定义 postal_code
以您想要的格式显示在列中。
df['postal_code'] = df['postal_code'].astype(str)
df['postal_code'] = [(x[:3]+" "+x[3:]) for x in df['postal_code']]
输出:
ID postal_code
0 1 k1b 6j2
1 2 k1b 6j3
2 3 k1b 6j4
3 4 k1b 6j5
最后在一个100k长的数据框架中,与其他一些方法进行比较。
df['postal_code'] = [(x[:3]+" "+x[3:]) for x in df['postal_code']]
First method time: 0.08260965347290039
df['postal_code'] = df["postal_code"].str[:3] + " " + df["postal_code"].str[3:]
Second method time: 0.112518310546875
在pandas中,你可以使用 "apply "来实现你的需求。
df['postal_code'] = df['postal_code'].apply(lambda x:x[:3]+' '+x[-3:])
另一种方法是使用 熊猫串支持 它有很多很好的方法来处理字符串,比如直接对字符串列进行切片。
>>> import pandas as pd
>>> df = pd.DataFrame({"index": range(10), "code": ["k1b6j2"]*10})
>>> df["postal_code"] = df["code"].str[:3] + " " + df["code"].str[3:]
>>> df
index code postal_code
0 0 k1b6j2 k1b 6j2
1 1 k1b6j2 k1b 6j2
2 2 k1b6j2 k1b 6j2
3 3 k1b6j2 k1b 6j2
4 4 k1b6j2 k1b 6j2
5 5 k1b6j2 k1b 6j2
6 6 k1b6j2 k1b 6j2
7 7 k1b6j2 k1b 6j2
8 8 k1b6j2 k1b 6j2
9 9 k1b6j2 k1b 6j2
将此方法应用于df中的所有邮政编码。
code_with_space = code_without_space[:3] + " " + code_without_space[3:]
怎么样:
pcode = 'k1b6j2'
pcode = pcode[:3] + ' ' + pcode[3:]