2017-09-03 82 views
1

我有在滾動窗口計算與基於行的行列這個例子中數據並因此被浮子:Python的熊貓:轉換爲2D列表列標題,而行值不爲NaN

import pandas as pd 
df = pd.DataFrame(data={'X': [1.5, 6.777, 2.444, pd.np.NaN], 'Y': [1.111, pd.np.NaN, 8.77, pd.np.NaN], 'Z': [5.0, 2.333, 10, 6.6666]}) 


Out[8]: 
     X  Y  Z 
0 1.500 1.111 5.0000 
1 6.777 NaN 2.3330 
2 2.444 8.770 10.0000 
3 NaN NaN 6.6666 

我希望將其轉換爲沒有NaN的行式2D列表,而不是真正的值,我想要提取列名稱;按等級排序。

所需的輸出:

[[Y, X, Z], [Z, X], [X, Y, Z], [z]] 

此外我想和一個選擇值的最大數目的第二輸出由所述排序等級來獲取。例如。要選擇最大條目數爲2,這將產生:

[[Y, X], [Z, X], [X, Y], [z]] 

不知道這是否在熊貓中也是優雅地完成的。如果沒有,沒有煩惱,比我能很容易地根據輸出1與listcomprehension做到使用類似:

limited = [x[:2] if len(x) > 2 else x for x in OUTPUT_STEP_1] 

回答

2

可以每一行單獨使用列表內涵與iterrowstranspose數據幀的過程。

首先sort_values,除去的NaN通過dropna並獲得indexlist(列被轉換爲索引,因爲每一行轉換爲Series)。

只能選擇第一和第二附加價值[]

L = [ x.sort_values().dropna().index.tolist() for idx, x in df.iterrows()] 
print (L) 
[['Y', 'X', 'Z'], ['Z', 'X'], ['X', 'Y', 'Z'], ['Z']] 

L1 = [ x.sort_values().dropna().index[:2].tolist() for idx, x in df.iterrows()] 
print (L1) 
[['Y', 'X'], ['Z', 'X'], ['X', 'Y'], ['Z']] 

df1 = df.T 
L = [ df1[x].sort_values().dropna().index.tolist() for x in df1] 
print (L) 
[['Y', 'X', 'Z'], ['Z', 'X'], ['X', 'Y', 'Z'], ['Z']] 

L1 = [ df1[x].sort_values().dropna().index[:2].tolist() for x in df1] 
print (L1) 
[['Y', 'X'], ['Z', 'X'], ['X', 'Y'], ['Z']] 
+2

廣東話同意比這更多。非常好。 – Dark

+0

@Bharathshetty - 謝謝。 – jezrael