2015-05-12 4 views
2

Я видел an answer to a question о преобразовании вложенного словаря «2D» в Pandas DataFrame. Это было бы решением моей проблемы, но тогда мне было интересно, могу ли я пропустить промежуточный шаг генерации вложенного словаря. Скажем, мой входаinput.txt выглядит следующим образом:Python Pandas - файл «1D» для 2D-массива

A B 1 
A C 2 
B C 3 

Можно ли преобразовать, что в следующей симметричную матрицу либо с пандами или Numpy без создания промежуточного вложенного словаря?

A B C 
A 0 1 2 
B 1 0 3 
C 2 3 0 

вложенный словарь, который я хочу, чтобы избежать создания будет:

d = {'A':{'B':1,'C':2},'B':{'C':3}} 

Я попробовал это после прочтения документации Tools IO на "Reading an index with a MultiIndex":

import pandas as pd 
df = pd.read_csv('input.txt', sep=' ', index_col=[0,1], header=None) 

Но я не получить 2D-карту тепла, когда я это сделаю:

import matplotlib.pyplot as plt 
plt.pcolor(df) 
plt.imshow() 
+0

Вместо объяснения принятого ответа на свой вопрос, вы можете редактировать или предложить правку к ответу DSM, положив объяснение в самом ответе –

+0

будет делать сразу @ ТИМ-castelijns. Спасибо, что обучил меня процедуре. –

+0

Не беспокойтесь. Он лучше подходит для формата Q & A –

ответ

5

Не уверен в том, что это все, что гораздо более эффективным, но вы могли бы pivot, а затем добавить рамку к своей транспонированной, что-то вроде:

df = pd.read_csv("input.txt", header=None, delim_whitespace=True) 
df = df.pivot(0,1,2) 
df.add(df.T, fill_value=0).fillna(0) 

    A B C 
A 0 1 2 
B 1 0 3 
C 2 3 0 

Вот документация по add и pivot. Вот что происходит. Первая линия df = pd.read_csv("input.txt", header=None, delim_whitespace=True) возвращается:

0 1 2 
0 A B 1 
1 A C 2 
2 B C 3 

Вторая строка df = df.pivot(0,1,2) затем возвращает:

1 B C 
0   
A 1 2 
B NaN 3 

магических чисел 0, 1 и 2 являются index, columns и values. index=0 - это имя столбца, используемое для создания индекса нового фрейма. index - это просто pandas lingo для названия строки. columns=1 - это имя столбца, используемое для создания столбцов нового фрейма. И values=2 - это просто имя столбца, которое нужно использовать для создания значений нового фрейма.

Третья строка df.add(df.T, fill_value=0).fillna(0) просто добавляет транспонирование для преобразования треугольной матрицы в симметричную матрицу. Она возвращает:

A B C 
A 0 1 2 
B 1 0 3 
C 2 3 0 
+0

благодарю вас за то, что вы первый человек, который показал мне, почему я, возможно, потрудился бы изучать панды. Извините за то, что вы не сразу ответили на свой ответ, но сначала мне пришлось прочитать документацию, чтобы понять часть ответа «df.pivot (0,1,2)». –

+0

Это неэффективно, но это всего лишь 3 строки кода, что очень важно для меня, так как это практическое занятие для курса в Африке с участием участников, у которых мало опыта программирования.Супер благодарен. Спасибо. –