我有一个数据帧df
,其中df.trajec
中的元素是一个列表。
例如,df.ix['smith']['trajec'] = ['a', 'b', 'c', 'a', 'b']
type(df.ix['smith']) = list
在这种情况下,我发现我不能使用这样的命令。
aaa = ['a', 'b', 'c', 'a', 'b']
df.loc[df.trajec == aaa]
它给我一条错误消息,如下所示。
ValueError: Arrays were different lengths: 8886 vs 5
有没有办法找到df.trajec
等于列表aaa
的数据帧df
的子集
发布于 2016-11-02 15:25:31
创建mask
需要apply
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
另一种可能的mask
是list comprehension
mask = [x == aaa for x in df.trajec.values]
print (mask)
[True, False, False]
print (df[mask])
trajec
smith [a, b, c, a, b]
发布于 2018-07-24 08:35:38
print df[df.trajec.apply(tuple) == ('a', 'b', 'c', 'a', 'b')]
trajec
smith [a, b, c, a, b]
而且这个解决方案似乎比公认的解决方案快20%:
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
有趣的是,来自公认答案的列表理解解决方案甚至更快:
%timeit df[[x == [42] for x in df.trajec.values]]
10 loops, best of 3: 21.7 ms per loop
https://stackoverflow.com/questions/40374384
复制相似问题