Заполнение фрейма данных из словаря ключей и значений: эффективный способ - PullRequest
1 голос
/ 03 апреля 2020

У меня в качестве примера приведен следующий фрейм данных.

df_test = pd.DataFrame(data=0, index=["green","yellow","red"], columns=["bear","dog","cat"])

У меня есть следующий словарь с ключами и значениями, которые совпадают или связаны с индексом и столбцами моего фрейма данных.

d = {"green":["bear","dog"], "yellow":["bear"], "red":["bear"]}

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

for k, v in d.items():
    for x in v:
        df_test.loc[k, x] = 1

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

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

d = {"green":["bear","dog"], "yellow":["bear"], "red":["bear"]}

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(list(d.values())),
                  columns=mlb.classes_,
                  index=list(d.keys()))
print (df)
        bear  dog
green      1    1
yellow     1    0
red        1    0

, а затем добавьте недостающие столбцы и метки индекса с помощью DataFrame.reindex:

df_test = df.reindex(columns=df_test.columns, index=df_test.index, fill_value=0)
print (df_test)
        bear  dog  cat
green      1    1    0
yellow     1    0    0
red        1    0    0
0 голосов
/ 03 апреля 2020

использование get_dummies()

# convert dict to a Series
s = pd.Series(d)
# explode your list into columns and get dummies
df = pd.get_dummies(s.apply(pd.Series), prefix='', prefix_sep='')

          bear    dog
green        1      1
yellow       1      0
red          1      0

обновление

# convert dict to a Series
s = pd.Series(d)

# create a new data frame
df = pd.DataFrame(s.values.tolist(), index=s.index)

# get_dummies
new_df = pd.get_dummies(df, prefix='', prefix_sep='')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...