Вероятно, проще всего сначала немного упростить данные перед созданием кадра данных.В зависимости от операции, которая дала вам исходные данные (список кортежей, каждый из которых содержит 2 строки и один и тот же), может быть возможно, что эта операция даст вам упрощенные данные.Но в случае, если это невозможно - или, в более общем случае, когда у вас нет контроля над структурами данных, сгенерированными данной библиотекой, вы можете сделать несколько простых манипуляций, например, так:
import pandas as pd
# initial data from qu
raw_data = [('a', 'a', {'weight': 2}),
('a', '!', {'weight': 0}),
('a', 'c', {'weight': 2}),
('a', 'b', {'weight': 1}),
('a', 'q', {'weight': 1}),
('a', 's', {'weight': 2}),]
# transform data to extract the value of each weight
data = [(elem1, elem2, d_elem.get('weight', 0)) for (elem1, elem2, d_elem) in raw_data]
# put together the dataframe from the list of records
df = pd.DataFrame.from_records(data, columns=['Inf', 'Prov', 'Weight'])
print(df)
дает желаемый результат:
Inf Prov Weight
0 a a 2
1 a ! 0
2 a c 2
3 a b 1
4 a q 1
5 a s 2
с помощью dict.get
позволяет нам указать значение по умолчанию, если оно не определено, вместо вызова KeyError.