Преобразовать словарь Python в фрейм данных со значениями dict (list) в виде столбцов и 1,0, если этот столбец находится в списке dict - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу создать фрейм данных из словаря в формате

Dictionary_ =  {'Key1': ['a', 'b', 'c', 'd'],'Key2': ['d', 'f'],'Key3': ['a', 'c', 'm', 'n']}

Я использую

df = pd.DataFrame.from_dict(Dictionary_, orient ='index')

Но он создает свои собственные столбцы до максимальной длины значений иположить значения словаря в качестве значений в кадре данных.

Мне нужен df с ключами в виде строк и значениями в виде столбцов, например

       a     b      c     d     e     f    m     n 
Key 1  1      1      1    1     0    0    0     0
Key 2  0      0      0    1     0    1    0     0
Key 3  1      0      1    0     0    0    1     1

Я могу сделать это, добавив все значения dict и создав пустой фрейм данных с ключами dict в виде строк и значений.в виде столбцов, а затем итерации по каждой строке, чтобы извлечь значения из dict и поставить 1 там, где он совпадает со столбцом, но это будет слишком медленно, так как мои данные имеют 200 000 строк, а .loc - медленно.Я чувствую, что могу как-то использовать манекены от панд, но не знаю, как их здесь применить.

Я чувствую, что будет более разумный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Использование get_dummies:

>>> pd.get_dummies(df).rename(columns=lambda x: x[2:]).max(axis=1, level=0)
      a  d  b  c  f  m  n
Key1  1  1  1  1  0  0  0
Key2  0  1  0  0  1  0  0
Key3  1  0  0  1  0  1  1
>>> 
0 голосов
/ 07 февраля 2019

Если важна производительность, используйте MultiLabelBinarizer и передайте keys и values:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(Dictionary_.values()),
                  columns=mlb.classes_, 
                  index=Dictionary_.keys()))
print (df)
      a  b  c  d  f  m  n
Key1  1  1  1  1  0  0  0
Key2  0  0  0  1  1  0  0
Key3  1  0  1  0  0  1  1

Альтернативно, но медленнее создать Series, затем str.join для string с и последнего вызова str.get_dummies:

df = pd.Series(Dictionary_).str.join('|').str.get_dummies()
print (df)
      a  b  c  d  f  m  n
Key1  1  1  1  1  0  0  0
Key2  0  0  0  1  1  0  0
Key3  1  0  1  0  0  1  1

Альтернатива с входом DataFrame - использовать pandas.get_dummies, но тогда необходим агрегат max на столбцы:

df1 = pd.DataFrame.from_dict(Dictionary_, orient ='index')

df = pd.get_dummies(df1, prefix='', prefix_sep='').max(axis=1, level=0)
print (df)
      a  d  b  c  f  m  n
Key1  1  1  1  1  0  0  0
Key2  0  1  0  0  1  0  0
Key3  1  0  0  1  0  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...