我想选择值不以某些str开头的行.例如,我有一只熊猫df
,我想选择不开始的数据t
,和c
.在此示例中,输出应为mext1
和okl1
.
import pandas as pd df=pd.DataFrame({'col':['text1','mext1','cext1','okl1']}) df col 0 text1 1 mext1 2 cext1 3 okl1
我要这个:
col 0 mext1 1 okl1
Ted Petrou.. 25
您可以使用str访问器来获取字符串功能.该get
方法可以获取字符串的给定索引.
df[~df.col.str.get(0).isin(['t', 'c'])] col 1 mext1 3 okl1
看起来您也可以使用startswith
要排除的值的元组(而不是列表).
df[~df.col.str.startswith(('t', 'c'))]
piRSquared.. 16
选项1
使用str.match
和负向前看
df[df.col.str.match('^(?![tc])')]
选项2
内query
df.query('col.str[0] not list("tc")')
选项3
numpy
广播
df[(df.col.str[0][:, None] == ['t', 'c']).any(1)]
col 1 mext1 3 okl1
时间测试
def ted(df): return df[~df.col.str.get(0).isin(['t', 'c'])] def adele(df): return df[~df['col'].str.startswith(('t','c'))] def yohanes(df): return df[df.col.str.contains('^[^tc]')] def pir1(df): return df[df.col.str.match('^(?![tc])')] def pir2(df): return df.query('col.str[0] not in list("tc")') def pir3(df): df[(df.col.str[0][:, None] == ['t', 'c']).any(1)] functions = pd.Index(['ted', 'adele', 'yohanes', 'pir1', 'pir2', 'pir3'], name='Method') lengths = pd.Index([10, 100, 1000, 5000, 10000], name='Length') results = pd.DataFrame(index=lengths, columns=functions) from string import ascii_lowercase for i in lengths: a = np.random.choice(list(ascii_lowercase), i) df = pd.DataFrame(dict(col=a)) for j in functions: results.set_value( i, j, timeit( '{}(df)'.format(j), 'from __main__ import df, {}'.format(j), number=1000 ) ) fig, axes = plt.subplots(3, 1, figsize=(8, 12)) results.plot(ax=axes[0], title='All Methods') results.drop('pir2', 1).plot(ax=axes[1], title='Drop `pir2`') results[['ted', 'adele', 'pir3']].plot(ax=axes[2], title='Just the fast ones') fig.tight_layout()
您可以使用str访问器来获取字符串功能.该get
方法可以获取字符串的给定索引.
df[~df.col.str.get(0).isin(['t', 'c'])] col 1 mext1 3 okl1
看起来您也可以使用startswith
要排除的值的元组(而不是列表).
df[~df.col.str.startswith(('t', 'c'))]
选项1
使用str.match
和负向前看
df[df.col.str.match('^(?![tc])')]
选项2
内query
df.query('col.str[0] not list("tc")')
选项3
numpy
广播
df[(df.col.str[0][:, None] == ['t', 'c']).any(1)]
col 1 mext1 3 okl1
时间测试
def ted(df): return df[~df.col.str.get(0).isin(['t', 'c'])] def adele(df): return df[~df['col'].str.startswith(('t','c'))] def yohanes(df): return df[df.col.str.contains('^[^tc]')] def pir1(df): return df[df.col.str.match('^(?![tc])')] def pir2(df): return df.query('col.str[0] not in list("tc")') def pir3(df): df[(df.col.str[0][:, None] == ['t', 'c']).any(1)] functions = pd.Index(['ted', 'adele', 'yohanes', 'pir1', 'pir2', 'pir3'], name='Method') lengths = pd.Index([10, 100, 1000, 5000, 10000], name='Length') results = pd.DataFrame(index=lengths, columns=functions) from string import ascii_lowercase for i in lengths: a = np.random.choice(list(ascii_lowercase), i) df = pd.DataFrame(dict(col=a)) for j in functions: results.set_value( i, j, timeit( '{}(df)'.format(j), 'from __main__ import df, {}'.format(j), number=1000 ) ) fig, axes = plt.subplots(3, 1, figsize=(8, 12)) results.plot(ax=axes[0], title='All Methods') results.drop('pir2', 1).plot(ax=axes[1], title='Drop `pir2`') results[['ted', 'adele', 'pir3']].plot(ax=axes[2], title='Just the fast ones') fig.tight_layout()
你可以使用str.startswith
和否定它.
df[~df['col'].str.startswith('t') & ~df['col'].str.startswith('c')] col 1 mext1 3 okl1
或者更好的选择,根据@Ted Petrou在元组中有多个字符:
df[~df['col'].str.startswith(('t','c'))] col 1 mext1 3 okl1
如果您更喜欢正则表达式,这是另一种选择:
df1[df1.col.str.contains('^[^tc]')]