2013-03-13 74 views
1

細胞會員測試這個問題是我的previous one選擇與pandas.DataFrame其中包含數組

的一部分。例如#2我有DF這樣的:

df = pd.DataFrame({ 
    'A': [[e for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)], 
    'B': [[e*10 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)], 
    'C': [[e*100 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)] 
}) 

       A    B     C 
0  [1, 2, 3]  [10, 20, 30]  [100, 200, 300] 
1  [4, 5, 6]  [40, 50, 60]  [400, 500, 600] 
2  [7, 8, 9]  [70, 80, 90]  [700, 800, 900] 
3 [10, 11, 12] [100, 110, 120] [1000, 1100, 1200] 
4 [13, 14, 15] [130, 140, 150] [1300, 1400, 1500] 

,我需要讓行,其中'A'包含10
現在即時通訊使用:

f = lambda x: 10 in x 
mask = df['A'].apply(f) 
df[mask] 

我的問題是:

  • 是否可以通過成員資格檢測進行檢索?有更好的嗎?
  • 是否將列表(和集合)放入DF單元中完全可以嗎?

回答

1

您構建多索引框架會好得多。這快得多 因爲這些原生類型的基礎數據(提示:做你的框架df.dtypes,他們將目標)

In [3]: A = pd.DataFrame([[e for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)]) 

In [4]: B = pd.DataFrame([[e*10 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)]) 

In [5]: C = pd.DataFrame([[e*100 for e in xrange(x+1, x+4)] for x in xrange(0, 15, 3)]) 

# this creates a 2-level hierarchy 
In [9]: df = pd.concat([A,B,C],keys=['A','B','C'],axis=1) 

Out[8]: 
    A   B    C    
    0 1 2 0 1 2  0  1  2 
0 1 2 3 10 20 30 100 200 300 
1 4 5 6 40 50 60 400 500 600 
2 7 8 9 70 80 90 700 800 900 
3 10 11 12 100 110 120 1000 1100 1200 
4 13 14 15 130 140 150 1300 1400 1500 

# select out A 
In [14]: df['A'] 
Out[14]: 
    0 1 2 
0 1 2 3 
1 4 5 6 
2 7 8 9 
3 10 11 12 
4 13 14 15 

# this is a boolean array 
In [11]: df['A']>10 
Out[11]: 
     0  1  2 
0 False False False 
1 False False False 
2 False False False 
3 False True True 
4 True True True 

選擇特定片

In [26]: df.ix[:,('A',1)] 
Out[26]: 
0  2 
1  5 
2  8 
3 11 
4 14 
Name: (A, 1), dtype: int64