假设我有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)中做到这一点? (无论是否有熊猫。我认为熊猫可能有所帮助)
答案 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)
阅读文件时;对于您阅读的每个属性,请检查地图以查看密钥是否包含该属性。如果没有,请添加它,然后将已读取该属性的文件名添加到该键的值,如果该属性已经是地图的键,则只需将文件名添加为值。