【问题标题】:Python 3 Pandas Select Dataframe using Startswith + orPython 3 Pandas 使用 Startswith + 或选择数据框
【发布时间】:2017-03-08 01:04:43
【问题描述】:

正在寻找执行 str.startswith 的正确语法,但我想要多个条件。

我的工作代码只返回以字母“N”开头的办公室:

new_df = df[df['Office'].str.startswith("N", na=False)]

寻找一个返回可以以字母“N”、“M”、“V”或“R”开头的办公室的代码。以下似乎不起作用:

    new_df = df[df['Office'].str.startswith("N|M|V|R", na=False)]

我错过了什么?谢谢!

【问题讨论】:

  • IIUC 然后new_df = df[df['Office'].str.contains("^N|^M|^V|^R", na=False)] 应该可以工作
  • EdChum,作为答案添加它似乎有效!谢谢你。胡萝卜^是什么意思?
  • MaxU 的答案模式比较好,基本上^ 表示以后面的字符开头,所以我们在这里使用contains,因为它支持正则表达式模式

标签: regex python-3.x pandas dataframe startswith


【解决方案1】:

试试这个:

df[df['Office'].str.contains("^(?:N|M|V|R)")]

或:

df[df['Office'].str.contains("^[NMVR]+")]

演示:

In [91]: df
Out[91]:
        Office
0        No-No
1         AAAA
2    MicroHard
3       Valley
4        vvvvv
5   zzzzzzzzzz
6  Risk is fun

In [92]: df[df['Office'].str.contains("^(?:N|M|V|R)")]
Out[92]:
        Office
0        No-No
2    MicroHard
3       Valley
6  Risk is fun

In [93]: df[df['Office'].str.contains("^[NMVR]+")]
Out[93]:
        Office
0        No-No
2    MicroHard
3       Valley
6  Risk is fun

【讨论】:

  • 正试图思考比我的评论更好的正则表达式模式,但你打败了我 +1
【解决方案2】:

startswith 方法允许 stringtuple 作为其第一个参数:

# Option 1
new_df = df[df['Office'].str.startswith(('N','M','V','R'), na=False)

例子:

df = pd.DataFrame(data=[np.nan, 'Austria', 'Norway', 'Madagascar', 'Romania', 'Spain', 'Uruguay', 'Yemen'], columns=['Office'])
print(df)
df.Office.str.startswith(('N','M','V','R'), na=False)

输出:

       Office
0         NaN
1     Austria
2      Norway
3  Madagascar
4     Romania
5       Spain
6     Uruguay
7       Yemen


0    False
1    False
2     True
3     True
4     True
5    False
6    False
7    False

@MaxU 指出的其他选项是:

# Option 2
df[df['Office'].str.contains("^(?:N|M|V|R)")]

# Option 3
df[df['Office'].str.contains("^[NMVR]+")]

性能(非详尽测试):

from datetime import datetime

n = 100000

start_time = datetime.now()
for i in range(n):
    df['Office'].str.startswith(('N','M','V','R'), na=False)
print ("Option 1: ", datetime.now() - start_time)

start_time = datetime.now()
for i in range(n):
    df['Office'].str.contains("^(?:N|M|V|R)", na=False)
print ("Option 2: ", datetime.now() - start_time)

start_time = datetime.now()
for i in range(n):
    df['Office'].str.contains("^[NMVR]+", na=False)
print ("Option 3: ", datetime.now() - start_time)

结果:

Option 1:  0:00:22.952533
Option 2:  0:00:23.502708
Option 3:  0:00:23.733182

最终选择:时间上相差不大,所以sintax更简单,性能更好,我会选择选项1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多