如何在Pandas中删除不以'x'开头的行或保留以'x'开头的行

Mxr*_*888 7 python pandas

我整个上午一直在这里,并慢慢拼凑起来.但是对于我的生活,我无法弄清楚如何在Pandas中使用.str.startswith()函数.

我的XLSX电子表格如下

1 Name, Registration Date, Phone number
2 John Doe, 2015-11-20T19:54:45Z, 1.1112223333
3 Jane Doe, 2015-11-20T20:44:26Z, 65.1112223333
etc...
Run Code Online (Sandbox Code Playgroud)

所以我将它作为数据框导入,清理标题以便没有空格等,然后我想删除任何不以'1'开头的行.(或保留以"1"开头的行)并删除所有其他行.因此,在这个简短的例子中,删除整个'Jane Doe'条目,因为她的电话号码以'65开头'.

import pandas as pd
df = pd.read_excel('testingpanda.xlsx', sheetname = 'Export 1')
def colHeaderCleaner():
    cols = df.columns
    cols = cols.map(lambda x: x.replace(' ', '_') if isinstance(x, (str, unicode)) else x)
    df.columns = cols
    df.columns = [x.lower() for x in df.columns]

colHeaderCleaner()

#by default it sets the values in 'registrant_phone' as float64, so this is fixing that...
df['registrant_phone'] = df['registrant_phone'].astype('object')
Run Code Online (Sandbox Code Playgroud)

我得到的最接近的,我的意思是我能够执行的唯一一行没有烦人的追溯和其他错误:

df['registrant_phone'] = df['registrant_phone'].str.startswith('1')
Run Code Online (Sandbox Code Playgroud)

但所有这一切都将所有电话值转换为'NaN',它维护所有行和所有内容,如下所示:

print df
[output] name, registration_date, phone_number
[output] John Doe, 2015-11-20T19:54:45Z, NaN
[output] Jane Doe, 2015-11-20T20:44:26Z, NaN
Run Code Online (Sandbox Code Playgroud)

我搜索了太多的地方,甚至尝试列出,我已经尝试了不同版本的df.drop,似乎无法弄清楚任何事情.我从哪里开始?

Ami*_*ory 16

我对你的问题有点困惑.在任何情况下,如果你有一个df带有列的DataFrame 'c',并且你想要删除以...开头的项目1,那么最安全的方法是使用如下内容:

df = df[~df['c'].astype(str).str.startswith('1')]
Run Code Online (Sandbox Code Playgroud)