使用变量过滤pandas数据框

时间:2016-09-15 12:44:24

标签: python pandas

我坚持一些简单但我无法看到它尽管阅读了文档和相关的SO问题。这涉及过滤来自WordPress数据库的数据中的记录。

创建一些数据:

import pandas as pd

data = {'number': [1,2,3],\
        'field': ['billing_last_name', 'shipping_last_name', 'field_1435'],\
        'name': ['jones', 'smith', 'jones']}
dframe = pd.DataFrame(data)
print dframe

                field   name  number
0   billing_last_name  jones       1
1  shipping_last_name  smith       2
2          field_1435  jones       3

选择数据的子集:

field_filter = 'billing_last_name'
number_filter = 1
choice = dframe[(dframe['field'] == field_filter) & (dframe['number'] == number_filter)]
print choice

               field   name  number
0  billing_last_name  jones       1
0    jones
Name: name, dtype: object

使用此结果设置变量以进行进一步过滤:

match = str(choice['name'])

这是问题的起点。如果我用变量过滤它什么都不返回:

print dframe[dframe['name'] == match]

Empty DataFrame
Columns: [field, name, number]
Index: []    

如果我使用变量保持的字符串运行相同的过滤器,则返回正确的结果:

print dframe[dframe['name'] == 'jones']

               field   name  number
0  billing_last_name  jones       1
2         field_1435  jones       3

然而,变量及其内容都是字符串,显然是:

print type('jones')
print type(match)

<type 'str'>
<type 'str'>

为什么带变量的过滤器不起作用?

3 个答案:

答案 0 :(得分:2)

match实际上是pandas series,而不是string变量&#34; jones&#34;。在这种情况下,您需要访问string中的series值:

field_filter = 'billing_last_name'
number_filter = 1
choice = dframe[(dframe['field'] == field_filter) & (dframe['number'] == number_filter)]

match = choice['name'].values[0]
dframe[dframe['name'] == match]

此外,假设您执行name过滤时只有一个choice(即&#34; Jones&#34;)。如果没有,以上将无法正常工作。让我知道,我会更新答案。

答案 1 :(得分:1)

问题在于str(choice.name)不会按照您的想法行事。类型是

In [205]: type(choice.name)
Out[205]: pandas.core.series.Series

所以str只找到系列的字符串表示。

要以您希望的方式访问它,您可以使用以下内容:

In [206]: dframe[dframe['name'] == choice.name.values[0]]
Out[206]: 
               field   name  number
0  billing_last_name  jones       1
2         field_1435  jones       3

答案 2 :(得分:0)

也许你应该创建匹配:

match = str(choice['name'][0])

原因选择['name'] 是系列