2016-06-26 52 views
1

假設我有100個文件,並遍歷所有這些文件。在每個文件中,都有幾個屬性的記錄:(在讀取所有文件之前未知屬性的總數)用Python生成數據透視表

假設一個簡單的情況,在讀取所有文件後,我們獲得20個不同的屬性,並獲得以下信息:

File_001: a1, a3, a5, a2 
File_002: a1, a3 
File_003: a4 
File_004: a4, a2, a6 
File_005: a7, a8, a9 
... 
File_100: a19, a20 

[更新]或者,在另一種表示,其中每一行是一個文件和一個屬性之間的單個匹配:

File_001: a1 
File_001: a3 
File_001: a5 
File_001: a2 
File_002: a1 
File_002: a3 
File_003: a4 
File_004: a4 
File_004: a2 
File_004: a6 
... 
File_100: a19 
File_100: a20 

如何可以產生「反向」統計信息表,即:

a1: File_001, File_002, File_006, File_083 
a2: File_001, File_004 
... 
a20: File_099, File_100 

如何在Python(2.7.x)中執行此操作? (有或沒有熊貓,我認爲熊貓可能有幫助)

回答

4

UPDATE2:如何可以產生 「反向」 統計表

In [9]: df 
Out[9]: 
     file attr 
0 File_001 a1 
1 File_001 a3 
2 File_001 a5 
3 File_001 a2 
4 File_002 a1 
5 File_002 a3 
6 File_003 a4 
7 File_004 a4 
8 File_004 a2 
9 File_004 a6 
10 File_100 a19 
11 File_100 a20 

In [10]: df.groupby('attr')['file'].apply(list) 
Out[10]: 
attr 
a1  [File_001, File_002] 
a19    [File_100] 
a2  [File_001, File_004] 
a20    [File_100] 
a3  [File_001, File_002] 
a4  [File_003, File_004] 
a5    [File_001] 
a6    [File_004] 
Name: file, dtype: object 

UPDATE:

如何設置輸出[202]作爲數據幀?

new = (df.set_index('file') 
     .apply(lambda x: pd.Series(x['attr']), axis=1) 
     .stack() 
     .reset_index(level=1, drop=True) 
     .reset_index(name='attr') 
     .groupby('attr')['file'] 
     .apply(list) 
) 

,所以我可以導出爲HTML或CSV?

new.to_csv('/path/to/file.csv', index=False) 

html_text = new.to_html(index=False) 

原來的答覆:

這裏是大熊貓的解決方案:

原DF:

In [201]: df 
Out[201]: 
     file    attr 
0 File_001 [a1, a3, a5, a2] 
1 File_002   [a1, a3] 
2 File_003    [a4] 
3 File_004  [a4, a2, a6] 
4 File_005  [a7, a8, a9] 
5 File_100  [a19, a20] 

解決方案:

In [202]: %paste 
(df.set_index('file') 
    .apply(lambda x: pd.Series(x['attr']), axis=1) 
    .stack() 
    .reset_index(level=1, drop=True) 
    .reset_index(name='attr') 
    .groupby('attr')['file'] 
    .apply(list) 
) 
## -- End pasted text -- 

輸出:

Out[202]: 
attr 
a1  [File_001, File_002] 
a19    [File_100] 
a2  [File_001, File_004] 
a20    [File_100] 
a3  [File_001, File_002] 
a4  [File_003, File_004] 
a5    [File_001] 
a6    [File_004] 
a7    [File_005] 
a8    [File_005] 
a9    [File_005] 
Name: file, dtype: object 
+0

謝謝!它完美的工作!如何將輸出[202]設置爲DataFrame?所以我可以將它導出爲html或csv?結果似乎沒有辦法導出... –

+0

如果我有原始的DF,每行只有一個屬性,例如'File_001 a1'(換行符)'File_001 a2'(換行符)'文件002 a1'等。如何調整複合代碼行以實現期望輸出(也作爲DF)? –

+1

@JimRaynor,我已經更新了我的答案 - 請檢查 – MaxU

0

在閱讀文件時;對於您讀取的每個屬性,請檢查映射以查看鍵是否包含該屬性。如果不是,請添加它,然後將您已經讀取該屬性的文件名添加到該密鑰的值中,並且如果該屬性已經是地圖的一個鍵,則只需將該文件名添加爲值即可。