2014-02-28 36 views
1

是否有可能通过测试对象类来过滤df中的一个序列?布尔索引来测试一系列对象的类别?

我已经试过:

df[isinstance(df['A'],list)] 

..但是,这并不工作。

+1

我认为这是值得一提的是,在系列/ DataFrames存储列表是通常效率不高,而且你失去了numpy/pandas的许多好处。将有趣的看到*为什么*你这样做:) –

+0

mongodb是数据源。 mongo在检索子字段时不会变平,所以直接将数据直接拖到df中就像这样:'df = pd.DataFrame(list(jobs.find({},{'id':1,'avgtime.overall': 1})))'包含列表的avgtime系列的结果。通过使用EdChum的帮助,我能够编写一个函数来“批准”这个系列。 –

+0

如果你可以返回mongo查询作为一个字符串,read_json可以压扁子字段(并且效率会很高)。我回头看了一会儿,但是因为没有使用它,所以没有跟进...会有直接的mongo - > pandas。 –

回答

1

您可以使用apply和测试柱像这样:

In [5]: 

import pandas as pd 
df = pd.DataFrame({'a':[1,'dsvfsdv', [1,2,3,4,5,], 3.4565, list('asdad')]}) 
df 

Out[5]: 

       a 
0    1 
1   dsvfsdv 
2 [1, 2, 3, 4, 5] 
3   3.4565 
4 [a, s, d, a, d] 

[5 rows x 1 columns] 

In [6]: 

df.apply(lambda row: isinstance(row.a, list), axis=1) 

Out[6]: 

0 False 
1 False 
2  True 
3 False 
4  True 
dtype: bool 

现在你可以使用这个作为掩模:

In [10]: 

df[df.apply(lambda row: isinstance(row.a, list), axis=1)] 

Out[10]: 

       a 
2 [1, 2, 3, 4, 5] 
4 [a, s, d, a, d] 

[2 rows x 1 columns] 
+0

完美的工作。谢谢! –

0

我不这么认为。很确定你需要一个循环,并且必须对列表中的每种类型运行isinstance测试。如果列表是对象而不是特定的类,则需要为列表中的每个元素调用getClass()以使isinstance正常工作。