微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 包含数组条目的列的pandas查询

ykp.data
Out[182]: 
    state  action  reward  
0    [41]       5      59  
1     [5]      52      48  
2    [46]      35      59  
3    [42]      16      12  
4    [43]      37      48   
5    [36]       5      59   
6    [49]      52      48 
7    [39]      11      23

我想在状态条目中找到匹配[42]的行,所以我跑了

ykp.data.query('state == [42]')

但我明白了

Empty DataFrame
Columns: [state,action,reward]
Index: []

当我应该看到[42],16,12.

有人可以告诉我如何解决这个问题吗?我需要将状态值存储为数组.

解决方法

最好在这里避免使用pd.Series.apply.相反,您可以使用itertools.chain构建常规NumPy数组.然后将数组与整数进行比较以形成用于索引的布尔数组:

from itertools import chain

df = pd.DataFrame(np.random.randint(0,100,size=(100000,1)),columns=['state'])
df = df.assign(state=df.state.apply(lambda x: [x]),axis=1)

def wen(df):
    df.state=df.state.astype(str)
    return df.query("state == '[42]'")

%timeit df[np.array(list(chain.from_iterable(df['state'].values))) == 42]  # 14.2 ms
%timeit df[df.state.apply(tuple) == (42,)]                                 # 41.9 ms
%timeit df.loc[df.state.apply(lambda x: x==[42])]                          # 33.9 ms
%timeit wen(df)                                                            # 19.9 ms

更好的是,不要在数据框中使用列表.只需使用常规的int系列.这将是内存和性能效率.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐