2016-07-15 28 views
0

我想將熊貓系列分爲關鍵和值對。我的程序將它轉換爲鍵和值對,但我想要這個鍵和值的格式。如何將熊貓系列分爲關鍵值?

輸入文本文件包含以下數據:

Input.txt-

3=123|4=88|5=M|8=75|9=29 
3=38|4=13|5=I|8=17.3|9=10|1021=0|854=p|394=7.73|474=7.7477558 

程序 - 代碼 -

df = pd.read_csv(inputfile, index_col=None, names=['text']) 
    df_list = df.values.T.tolist() 
    s = df.text.str.split('|') 
    splited_list = s.values.T.tolist() 
    s1 = pd.Series(splited_list) 
    ds = [dict(w.split('=', 1) for w in x) for x in s1] 
    p = pd.DataFrame.from_records(ds) 
    p1 = p.replace(np.nan,'n/a', regex=True) 
    st = p1.stack(level=0,dropna=False) 
    dfs = [g for i, g in st.groupby(level=0)] 
    dfs_length = len(dfs) 
    i = 0 
    while i < dfs_length: 
     #index of each column 
     print '\nindex[%d]'%i 
     for k,v in dfs[i].iteritems(): 
      print k,' : ',v 
     i = i + 1 

這將產生以下的輸出:

輸出 -

index[0] 
(0, '1021') : n/a 
(0, '3') : 123 
(0, '394') : n/a 
(0, '4') : 88 
(0, '474') : n/a 
(0, '5') : M 
(0, '8') : 75 
(0, '854') : n/a 
(0, '9') : 29 

index[1] 
(1, '1021') : 0 
(1, '3') : 38 
(1, '394') : 7.73 
(1, '4') : 13 
(1, '474') : 7.7477558 
(1, '5') : I 
(1, '8') : 17.3 
(1, '854') : p 
(1, '9') : 10 

我想在其他格式的輸出。我希望這個n/a內容在每個結果的末尾出現,並且我想刪除這些鍵的索引和括號。輸出內容也應該與輸入文件中的可用順序相同。

預期輸出:

index[0] 
3  123 
4  88 
5  M 
8  75 
9  29 
1021 n/a 
394  n/a 
474  n/a 
854  n/a 

index[1] 
3  38 
4  13 
5  I 
8  17.3 
9  10 
1021 0 
854  p  
394  7.73 
474  7.7477558 

我如何能得到這個類型的輸出有什麼建議?

+1

請在您的文章中添加示例數據,以便您的示例具有可重現性。 – BrenBarn

+0

@ BrenBarn-是的,肯定看到Input.txt。 – kit

+0

@ BrenBarn-難以理解這個問題嗎? – kit

回答

0

我可以回答你的問題的一半。擺脫支架和索引,你需要稍微調整你的代碼,如:

i = 0 
while i < len(dfs):  
    #index of each column 
    print ('\nindex[%d]'%i) 
    for (_,k),v in dfs[i].iteritems(): 
     print (k,' : ',v) 
    i = i + 1 

然後結果是這樣的:

index[0] 
1021 : n/a 
3 : 123 
394 : n/a 
4 : 88 
474 : n/a 
5 : M 
8 : 75 
854 : n/a 
9 : 29 

index[1] 
1021 : 0 
3 : 38 
394 : 7.73 
4 : 13 
474 : 7.7477558 
5 : I 
8 : 17.3 
854 : p 
9 : 10 

最後,關於輸出順序,該解決方案將改變一些關於這條線:

ds = [dict(w.split('=', 1) for w in x) for x in s1] 

由於S1仍然包含正確的順序,而DS不會:

S1

0      [3=123, 4=88, 5=M, 8=75, 9=29] 
1 [3=38, 4=13, 5=I, 8=17.3, 9=10, 1021=0, 854=p,... 
dtype: object 

DS

[{'3': '123', '4': '88', '5': 'M', '8': '75', '9': '29'}, 
{'1021': '0', 
    '3': '38', 
    '394': '7.73', 
    '4': '13', 
    '474': '7.7477558', 
    '5': 'I', 
    '8': '17.3', 
    '854': 'p', 
    '9': '10'}] 

在我看來,對於字典鍵自動排序爲字符串這就解釋了爲什麼1021到來之前3.我雖然有關升序排序它們,但這不會產生您從txt數據請求的訂單。因此我不知道解決方案,我也很好奇答案。