关于python:pandas使用startswith从Dataframe中选择

pandas select from Dataframe using startswith

这项工作(使用熊猫12 dev)

1
table2=table[table['SUBDIVISION'] =='INVERNESS']

然后我意识到我需要用"开始于"来选择这个字段,因为我错过了一堆。所以,根据熊猫医生的说法,我尽可能地跟在后面,我试过了。

1
2
criteria = table['SUBDIVISION'].map(lambda x: x.startswith('INVERNESS'))
table2 = table[criteria]

并且得到attributeError:'float'对象没有属性'startswith'

所以我用相同的结果尝试了另一种语法

1
table[[x.startswith('INVERNESS') for x in table['SUBDIVISION']]]

参考http://pandas.pydata.org/pandas docs/stable/indexing.html布尔索引第4节:序列的列表理解和映射方法也可用于生成更复杂的标准:

我错过了什么?


您可以使用str.startswith数据帧方法来提供更一致的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [11]: s = pd.Series(['a', 'ab', 'c', 11, np.nan])

In [12]: s
Out[12]:
0      a
1     ab
2      c
3     11
4    NaN
dtype: object

In [13]: s.str.startswith('a', na=False)
Out[13]:
0     True
1     True
2    False
3    False
4    False
dtype: bool

布尔型索引将很好地工作(我更喜欢使用loc,但在没有它的情况下工作是一样的):

1
2
3
4
5
In [14]: s.loc[s.str.startswith('a', na=False)]
Out[14]:
0     a
1    ab
dtype: object

.

看起来系列/列中至少有一个元素是float,它没有startsWith方法,因此attributeError,列表理解应该引发相同的错误…


检索以所需字符串开头的所有行

1
dataFrameOut = dataFrame[dataFrame['column name'].str.match('string')]

检索包含所需字符串的所有行

1
dataFrameOut = dataFrame[dataFrame['column name'].str.contains('string')]


您可以使用apply轻松地将任何字符串匹配函数应用于列元素。

1
table2=table[table['SUBDIVISION'].apply(lambda x: x.startswith('INVERNESS')]

假设您的"细分"列是正确的类型(字符串)