Эта проблема может быть довольно специфической, но я уверен, что многие могут столкнуться с этим.
Таким образом, у меня есть DataFrame в форме как:
asd = pd.DataFrame({'Col1': ['a', 'b', 'b','a','a'], 'Col2': [0,0,0,1,1]})
Полученная таблица выглядит следующим образом:
I -- Col1 -- Col2
1 -- a -- 0
2 -- b -- 0
3 -- b -- 0
4 -- a -- 1
5 -- a -- 1
Что я пытаюсь сделать, это:
если хотя бы одно значение "a" в Col1
имеет соответствующее значение 1
в Col2
, то в Col3
мы ставим 1
для всех значений "a"
в противном случае (если хотя бы один «а» не имеет значения 1), мы помещаем «0» для всех значений «а»
И затем повторите для всех других значений в Col1
.
Результат операции должен выглядеть следующим образом:
I -- Col1 -- Col2 -- Col3
1 -- a -- 0 -- 1 because "a" has value of 1 in 4th and 5th lines
2 -- b -- 0 -- 0 because all "b" have values of 0
3 -- b -- 0 -- 0
4 -- a -- 1 -- 1
5 -- a -- 1 -- 1
В настоящее время я делаю это:
asd['Col3'] = 0
col1_uniques = asd.drop_duplicates(subset='Col1')['Col1']
small_dataframes = []
for i in col1_uniques:
small_df = asd.loc[asd.Col1 == i]
if small_df.Col2.max() == 1:
small_df['Col3'] = 1
small_dataframes.append(small_df)
Затем я снова собираю фрейм данных.
Однако это занимает слишком много времени (у меня около 80000 уникальных значений в Col1). На самом деле, пока я писал это, он не закончил даже четверть этой работы.
Есть ли лучший способ сделать это?