删除 pandas 中不包含值的行

Delete rows not containing a value in pandas

我已经尝试了很多东西,但似乎无法找到有用的东西。基本上我有一个 XLSX 文件,它有 3 列(姓名、电子邮件、Phone 号码),然后是许多行。 phone 号码以不同的国家代码开头“+1.xxxxxxxxxx”“+90.xxxxxxxxxx”“+34”。等等 我要做的第一件事是删除所有不以“+1”开头的行。并想通过删除明显假的 and/or 不完整的 phone 号码来进一步过滤,例如,有时人们使用 '+1.5555555555' 或者不给我完整的号码,所以我会得到 '+1.12345678' (不是完整的 10 位数字,如果算上“+1”,则为 13)。然后在完成所有这些之后,将其写入 .csv。

到目前为止我的代码如下:

import pandas as pd

xl_file = pd.ExcelFile('testexcel.xlsx')
df = xl_file.parse('Sheet 1', index_col='Name', na_values=['NA'])
#df.drop(df.columns[[0]], axis=1, inplace=True)
df = df[df['Phone'] != '+1.*']
df.to_csv('testingpandas.csv')

#df.drop... 组件只是我在玩 df.dop 并删除了整个列。下一行是我尝试使用 this answer 来获得我想要的结果,但我就是找不到正确的结果。最后的'*'是我认为的通配符。

是否最好过滤“+1”,然后编写一些内容,然后删除该列中字符串总数不为 13 的行?

您可以使用 pandas 索引来过滤掉行,或者编写自定义函数。

为了示例,我将展示 2 种方式,仅保留以 +1 开头且长度为 13 的行。

pandas 索引:

df = df[(df['Phone'].str.startswith('+1')) & (df['Phone'].str.len() == 13)]

另一种方式,自定义方法:

def filter_by_beginning_and_len(phone):
    return str(phone).startswith('+1') and len(str(phone)) == 13

df = df[df['Phone'].apply(filter_by_beginning_and_len)]