Установка значения на одном кадре данных на основе идентификатора и значения на другом кадре данных - PullRequest
2 голосов
/ 16 апреля 2020

У меня проблема с моими фреймами данных.

Первый фрейм данных выглядит так:


id     0    1    2    3

100    0    0    0    0
101    0    0    0    0
102    0    0    0    0
103    0    0    0    0

Второй фрейм данных выглядит так:

id     num

100    1
100    2
100    3
101    0
101    3
102    1
103    2
103    3

И я хочу замените нули в первом кадре данных на нули в указанных c строках, представленных «id» в столбцах, которые представлены во втором кадре данных в столбце «num» с указанием c «id». Итак, в конце я хотел бы изменить первый фрейм данных на:

id     0    1    2    3

100    0    1    1    1
101    1    0    0    1
102    0    1    0    0
103    0    0    1    1

Как я могу это сделать? Я знаю, что могу использовать для l oop (который я уже подготовил), но мои кадры данных очень велики, и это займет около 4 часов до конца sh. Я думал о картографии в pandas, но у меня не было решения.

С уважением

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Используйте get_dummies с max по индексу для значений индикатора, при необходимости значения счетчика используйте sum вместо max:

df = pd.get_dummies(df2.set_index('id')['num']).max(level=0)
print (df)
     0  1  2  3
id             
100  0  1  1  1
101  1  0  0  1
102  0  1  0  0
103  0  0  1  1

Если возможно, больше строк или столбцы в первом DataFrame добавить DataFrame.reindex:

df = (pd.get_dummies(df.set_index('id')['num']).max(level=0)
        .reindex(index=df1.index, columns=df1.columns, fill_value=0))
1 голос
/ 16 апреля 2020

Назвав первый фрейм данных df1 и второй df2, вы можете повернуть фрейм данных df2:

df2['value'] = 1
df1 = df2.pivot_table(index='id', columns='num', values='value', fill_value=0)

Выход:

num  0  1  2  3
id             
100  0  1  1  1
101  1  0  0  1
102  0  1  0  0
103  0  0  1  1
...