2016-12-24 42 views
1

一些條件每宗指數(行)的列名我有以下幾點:獲得這樣的列值時在大熊貓

>>> import pandas as pd 
>>> x = pd.DataFrame({'a':[1,3,5], 'b':[4,0,6]}) 
>>> x 
    a b 
0 1 4 
1 3 0 
2 5 6 
>>> required = {0:['b'],1:['a'],2:['a','b']} ---> how to get it from x?? 
#keys -> index of x 
#values -> list of col names such that value is >2 

我們怎樣才能做到這一點有效?

回答

1

這裏有兩個概念,其是有效的:

pd.DataFrame(x.columns.where(x > 2, '')) 
Out: 
     0 
0 (, b) 
1 (a,) 
2 (a, b) 

np.where(x > 2, x.columns, '').T 
Out: 
array([['', 'a', 'a'], 
     ['b', '', 'b']], dtype=object) 
0

不知道有效率,但工程:

df = pd.DataFrame({'a':[1,3,5], 'b':[4,0,6]}) 
a = defaultdict(list) 
for b,c in df.iterrows(): 
    for d in c.iteritems(): 
     if d[1]>2: 
      a[b].append(d[0]) 
print dict(a) 

輸出:

{0: ['b'], 1: ['a'], 2: ['a', 'b']} 
3

下面是一個使用一個班輪applyto_dict方法。

In [162]: (x > 2).apply(lambda y: x.columns[y.tolist()].tolist(), axis=1).to_dict() 
Out[162]: {0: ['b'], 1: ['a'], 2: ['a', 'b']} 

詳細

In [173]: (x > 2) 
Out[173]: 
     a  b 
0 False True 
1 True False 
2 True True 

In [174]: (x > 2).apply(lambda y: [y.tolist()], axis=1) 
Out[174]: 
0 [[False, True]] 
1 [[True, False]] 
2  [[True, True]] 
dtype: object 

In [175]: (x > 2).apply(lambda y: x.columns[y.tolist()].tolist(), axis=1) 
Out[175]: 
0  [b] 
1  [a] 
2 [a, b] 
dtype: object 

這裏的另一個需要一行代碼。

In [205]: {i: x.columns[y.tolist()].tolist() for i, y in (x > 2).iterrows()} 
Out[205]: {0: ['b'], 1: ['a'], 2: ['a', 'b']} 

或者

In [122]: {i: y[y].index.tolist() for i, y in (x > 2).iterrows()} 
Out[122]: {0: ['b'], 1: ['a'], 2: ['a', 'b']} 
+0

1件事。 'x.columns [y.tolist()]'爲什麼會引發錯誤'ValueError:值的長度與索引的長度不匹配'雖然'x.columns [y.tolist()]。tolist()'不? – MYGz

+0

這非常完美:) 謝謝! – xlax