用一个变量过滤pandas数据框

3

我遇到了一些简单的问题,但是尽管阅读了文档和相关的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个回答

5

match实际上是一个pandasseries,而不是字符串变量"jones"。在这种情况下,您需要访问series内的字符串值:

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

matches = choice['name'].values
dframe[dframe['name'].isin(matches)]

假设您可以在匹配项中有多个元素。 这可能是/可能不是期望的效果(我可以更新答案)。


感谢您以及其他两个回答,它们也很有帮助。如果我的原始 - Pete Kelly
如果我的原匹配过滤器是一个Series,为什么type(match)显示它为字符串?这就是促使我问问题的原因。 - Pete Kelly
你仍然可以将 series 转换为 string,但它也会包括额外的 dtype 信息。match = str(choice['name']) 的结果是:'0 jones\nName: name, dtype: object',但是 match = str(choice['name'].values[0] 的结果是 'jones'(正如所需)。 - NickBraunagel

1
问题在于str(choice.name)不会像你想的那样运行。类型为
In [205]: type(choice.name)
Out[205]: pandas.core.series.Series

所以str只是找到了Series的字符串表示。

为了按照您想要的方式访问它,您可以使用以下方法:

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

嘿,你比我先做到了。 - NickBraunagel
谢谢,非常感激! - NickBraunagel

0

也许你应该将匹配项创建为:

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

因为 choice['name'] 是一个Series


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接