首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当dataframe元素的值为list时如何使用.loc [python pandas]

当dataframe元素的值为list时如何使用.loc [python pandas]
EN

Stack Overflow用户
提问于 2016-11-02 15:21:09
回答 2查看 2.5K关注 0票数 3

我有一个数据帧df,其中df.trajec中的元素是一个列表。

例如,df.ix['smith']['trajec'] = ['a', 'b', 'c', 'a', 'b']

type(df.ix['smith']) = list

在这种情况下,我发现我不能使用这样的命令。

代码语言:javascript
复制
aaa = ['a', 'b', 'c', 'a', 'b']
df.loc[df.trajec == aaa]

它给我一条错误消息,如下所示。

ValueError: Arrays were different lengths: 8886 vs 5

有没有办法找到df.trajec等于列表aaa的数据帧df的子集

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 15:25:31

创建mask需要apply

代码语言:javascript
复制
df = pd.DataFrame({'trajec':[['a', 'b', 'c', 'a', 'b'],
                             ['a', 'b'],
                             ['a','c', 'b']]}, 
                   index=['smith','smith1','smith2'])

print (df)
                 trajec
smith   [a, b, c, a, b]
smith1           [a, b]
smith2        [a, c, b]

aaa = ['a', 'b', 'c', 'a', 'b']
mask = df.trajec.apply(lambda x: x == aaa)
print (mask)
smith      True
smith1    False
smith2    False
Name: trajec, dtype: bool

#loc can be omit if need filter all columns
print (df[mask])
                trajec
smith  [a, b, c, a, b]

#if need apply mask and return only column `trajec`
print (df.loc[mask, 'trajec'])
smith    [a, b, c, a, b]
Name: trajec, dtype: object

另一种可能的masklist comprehension

代码语言:javascript
复制
mask = [x == aaa for x in df.trajec.values]
print (mask)
[True, False, False]

print (df[mask])
                trajec
smith  [a, b, c, a, b]
票数 2
EN

Stack Overflow用户

发布于 2018-07-24 08:35:38

代码语言:javascript
复制
print df[df.trajec.apply(tuple) == ('a', 'b', 'c', 'a', 'b')]    
                trajec
smith  [a, b, c, a, b]

而且这个解决方案似乎比公认的解决方案快20%:

代码语言:javascript
复制
df = pd.DataFrame(np.random.randint(0, 100, size=(100000, 1)), columns=['trajec'])
df = df.assign(trajec=df.trajec.apply(lambda x: [x]))

%timeit df[df.trajec.apply(tuple) == (42,)]
10 loops, best of 3: 23.3 ms per loop

%timeit df[df.trajec.apply(lambda x: x == [42])]
10 loops, best of 3: 29 ms per loop

有趣的是,来自公认答案的列表理解解决方案甚至更快:

代码语言:javascript
复制
%timeit df[[x == [42] for x in df.trajec.values]]
10 loops, best of 3: 21.7 ms per loop
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40374384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档