使用熊猫在csv中格​​式化电话号码

mat*_*ver 3 python csv formatting phone-number pandas

Python/熊猫 n00b。我有处理存储在 csv 文件中的事件数据的代码。数据来自df["CONTACT PHONE NUMBER"]将电话号码输出为`5555551212.0' 显然,“.0”是一个问题,但添加是因为它是一个整数,我想?

Anyhoo,为了可用性,我决定我应该格式化电话号码。

该数字来自未格式化的 csv 文件。该数字始终为十位数:5555551212,但我想将其显示为 (555)555-1212。

import glob
import os
import pandas as pd
import sys

csvfiles = os.path.join(directory, '*.csv')
for csvfile in glob.glob(csvfiles):
    df = pd.read_csv(filename)
    #formatting the contact phone
    phone_nos = df["CONTACT PHONE NUMBER"]
    for phone_no in phone_nos:
        contactphone = "(%c%c%c)%c%c%c-%c%c%c%c" % tuple(map(ord,phone_no))
Run Code Online (Sandbox Code Playgroud)

最后一行给了我以下错误: not enough arguments for format string

但也许这不是熊猫的做法。由于我正在遍历数组,因此我还需要将数据保存在其现有列中或在处理电话号码后重建该列。

And*_*den 6

我认为电话号码应该 存储 为 string
读取 csv 时,您可以确保将此列读取为字符串:

pd.read_csv(filename, dtype={"CONTACT PHONE NUMBER": str})
Run Code Online (Sandbox Code Playgroud)

您可以使用字符串方法,天真地添加:

In [11]: s = pd.Series(['5554443333', '1114445555', np.nan, '123'])  # df["CONTACT PHONE NUMBER"]

# phone_nos = '(' + s.str[:3] + ')' + s.str[3:7] + '-' + s.str[7:11]
Run Code Online (Sandbox Code Playgroud)

编辑:作为诺亚在相关问题中的回答,您可以使用str.replace更直接/更有效地执行此操作:

In [12]: phone_nos = s.str.replace('^(\d{3})(\d{3})(\d{4})$', r'(\1)\2-\3')

In [13]: phone_nos
Out[13]:
0    (555)4443-333
1    (111)4445-555
2              NaN
3              123
dtype: object
Run Code Online (Sandbox Code Playgroud)

但是这里有一个问题,因为你有一个格式错误的数字,而不是精确的 10 位数字,所以你可以 NaN 那些:

In [14]: s.str.contains('^\d{10}$')  # note: NaN is truthy
Out[14]:
0     True
1     True
2      NaN
3    False
dtype: object

In [15]: phone_nos.where(s.str.contains('^\d{10}$'))
Out[15]:
0    (555)4443-333
1    (111)4445-555
2              NaN
3              NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)

现在,您可能想检查您拥有的错误格式(也许您必须更改输出以包含它们,例如,如果它们包含国家/地区代码):

In [16]: s[~s.str.contains('^\d{10}$').astype(bool)]
Out[16]:
3    123
dtype: object
Run Code Online (Sandbox Code Playgroud)