создать фрейм данных из простого словаря - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть словарь, как показано ниже,

{'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}

, используя этот словарь. Я хочу создать фрейм данных для панд, как показано ниже,

   A  B  C  D  E  F  G  H  I  J
0  1  0  1  0  0  1  1  0  0  0
1  0  1  0  1  0  0  0  0  0  1
2  0  0  0  0  0  0  0  0  0  0
3  0  0  0  0  1  0  0  1  1  0

ключ вышеупомянутого словаря -значение пара представляет имя столбца - индекс , используя это значение. Я хочу создать фрейм данных, как описано выше.например, 'A': 0 представляет столбцы A при 0-м значении индекса, равном единице 'E': 3, представляет столбцы E при 3-м значении индекса, равном единице.

Пока я пробовал это,

df=pd.DataFrame(index=range(max(my_dic.values())),columns=[req_cols])
for u,v in my_dic.items():
    df.at[v,u]=1
print df.fillna(0)

Выше код работает нормально, но я думаю, что это не эффективный способ решить эту проблему.Есть ли какой-либо более эффективный подход для решения этой проблемы?

любая помощь будет действительно полезной.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Библиотека sklearn предлагает решение без явного цикла.

from sklearn.preprocessing import MultiLabelBinarizer

d = {'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}

mlb = MultiLabelBinarizer()

s = pd.DataFrame(list(d.items())).groupby(1)[0].apply(list).rename_axis(None)

res = pd.DataFrame(mlb.fit_transform(s), columns=mlb.classes_, index=s.index)\
        .reindex(range(s.index.max()+1)).fillna(0).astype(int)

print(res)

   A  B  C  D  E  F  G  H  I  J
0  1  0  1  0  0  1  1  0  0  0
1  0  1  0  1  0  0  0  0  0  1
2  0  0  0  0  0  0  0  0  0  0
3  0  0  0  0  1  0  0  1  1  0
0 голосов
/ 11 сентября 2018

Вот простое решение, но не обязательно самое быстрое.Более быстрое решение может использовать более быструю функцию one_at_index.numpy может обеспечить более быстрые средства.

d = {'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}

height = max(value for value in d.values())

def one_at_index(index, height):
    return [0]*index + [1] + [0]*(height - index)

result = pd.DataFrame({key: one_at_index(value, height) for key, value in d.items()})

print(result)

Out:
   A  C  B  E  D  G  F  I  H  J
0  1  1  0  0  0  1  1  0  0  0
1  0  0  1  0  1  0  0  0  0  1
2  0  0  0  0  0  0  0  0  0  0
3  0  0  0  1  0  0  0  1  1  0

Если порядок столбцов имеет значение для вас, просто добавьте columns=list("ABCDEFGHIJ") или эквивалентный вызов pd.DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...