2016-06-26 4 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 

[Update] Или в другом представлении, где каждая строка представляет собой один матч, между одним файлом и одним атрибутом:

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 

Как я могу генерировать «Reverse» таблицу статистики, а именно:

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

Как это сделать в Python (2.7.x)? (и с Пандами или без них, я думаю, что Pandas может помочь)

ответ

4

UPDATE2:Как я могу генерировать таблицу статистических данных "Reverse"

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], как 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 
+0

Спасибо! Он отлично работает! Как установить вывод [202] в качестве DataFrame? поэтому я могу экспортировать его в html или csv? Результат, похоже, не имеет метода для экспорта ... –

+0

И если у меня есть оригинальная DF с одним атрибутом на каждой строке, например. 'File_001 a1' (newline)' File_001 a2' (newline) 'File 002 a1' и т. Д. Как настроить составную строку кода для достижения результата желания (как и DF)? –

+1

@JimRaynor, я обновил свой ответ - пожалуйста, проверьте – MaxU

0

При чтении файлов; для каждого прочитанного атрибута проверьте карту, чтобы увидеть, содержат ли ключи атрибут. Если нет, добавьте его, а затем добавьте имя файла, которое вы прочитали для этого атрибута, значениям этого ключа, и если атрибут уже является ключом к карте, просто добавьте имя файла в качестве значения.

Смежные вопросы