在Python中生成数据透视数据

时间:2016-06-26 21:51:52

标签: python pandas dataframe pivot-table

假设我有100个文件,并遍历所有文件。在每个文件中,都有几个属性的记录:(在读取所有文件之前,不知道属性的总数)

假设一个简单的例子,在阅读完所有文件后,我们获得了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)中做到这一点? (无论是否有熊猫。我认为熊猫可能有所帮助)

2 个答案:

答案 0 :(得分: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

<强>更新

  

如何将输出[202]设置为DataFrame?

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

答案 1 :(得分:0)

阅读文件时;对于您阅读的每个属性,请检查地图以查看密钥是否包含该属性。如果没有,请添加它,然后将已读取该属性的文件名添加到该键的值,如果该属性已经是地图的键,则只需将文件名添加为值。