Обработка большого словаря и фрейма данных в python

У меня есть два фрейма данных pandas с формой (2500, 2500), фрейм данных выглядит так:

>> df1
    "a" "b" "c" "d" "e" 
"o"  0   0   0   0   0
"p"  0   0   0   0   0
"q"  0   0   0   0   0
"r"  0   0   0   0   0
"s"  0   0   0   0   0

И у меня есть два словаря с парами ключей и значений «~ 2 000 000». Это выглядит так

d1 = {("a", "o"):3, ("b", "p"):10}

Я пытаюсь ввести значения из словаря во фрейм данных. Мое решение прямо сейчас - просмотреть словарь:

for key, value in d1.iteritems():
    df1.loc[key[0], key[1]] = value

Однако этот процесс занимает очень много времени. Мне интересно, есть ли способ более эффективно просматривать словарь. Или мне следует изменить способ хранения данных? Заранее спасибо.

Заполняется только первый DataFrame 0?

jezrael 10.08.2018 16:24

@jezrael да, это правильно

KiwiFT 10.08.2018 16:32

@KiwiFT - Тогда воспользуйтесь вторым решением;)

jezrael 10.08.2018 16:34
1
4
443
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала создайте Series, затем unstack для DataFrame, транспонируйте T и последний combine_first для назначения значений df1:

d1 = {("a", "o"):3, ("b", "p"):10}
df = pd.Series(d1).unstack().T.combine_first(df1)
print (df)
     a     b    c    d    e
o  3.0   0.0  0.0  0.0  0.0
p  0.0  10.0  0.0  0.0  0.0
q  0.0   0.0  0.0  0.0  0.0
r  0.0   0.0  0.0  0.0  0.0
s  0.0   0.0  0.0  0.0  0.0

Если df1 заполнен 0, используйте только reindexindex и columnsdf1:

df = (pd.Series(d1)
        .unstack(fill_value=0)
        .T
        .reindex(index=df1.index, columns=df1.columns, fill_value=0))
print (df)
   a   b  c  d  e
o  3   0  0  0  0
p  0  10  0  0  0
q  0   0  0  0  0
r  0   0  0  0  0
s  0   0  0  0  0

Я просто попробовал это, при первом подходе чтение словаря с миллионом записей заняло ~ 30 секунд, а при втором подходе ~ 14 секунд. Большое спасибо!

KiwiFT 10.08.2018 16:40

Другие вопросы по теме