我坚持一些简单但我无法看到它尽管阅读了文档和相关的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'>
为什么带变量的过滤器不起作用?
答案 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'] 是系列