У меня есть dataframe, который выглядит следующим образом:Значение по умолчанию для панд поиска, когда значение поиска не существует или равна нулю
parent region
estid
1 NaN A
2 NaN B
3 1.0 A
4 1.0 B
5 2.0 C
6 2.0 C
7 8.0 A
То, что я хочу, чтобы создать дополнительный столбец, содержащий region
из parent
, недобросовестный None
, если родитель не найден в данных, например:
parent region parent_region
estid
1 NaN A None
2 NaN B None
3 1.0 A A
4 1.0 B A
5 2.0 C B
6 2.0 C B
7 8.0 A None
следующие возвращает правильный результат:
df["parent_region"] = df.apply(lambda x : df.loc[x["parent"]]["region"] if not math.isnan(x["parent"]) and x["parent"] in df.index else None, axis = 1)
Но я очень боюсь неэффективности, учитывая, что у моей DataFrame 168 миллионов строк. Есть ли лучший способ сделать это? Я посмотрел на и get
, но я не могу понять, как работать с идентификаторами, которые могут быть NaN
или нет в dataframe.
Например, я думал, что это может сработать: df.lookup(df["region"], df["parent"])
, но он не любит очень много нулевых ключей. df.get("region")
не возвращает область родителя, но сам столбец, поэтому он не делает то, что я хочу.
Как 'map' выполнять? - 'df.parent.map (df.region)' –
Чрезвычайно хорошо :-) В тесте на 100 тыс. строк карта занимает 0,02 секунды, а мое приложение занимает 16 секунд. С одной стороны, спасибо вам большое! С другой стороны, это раздражает, что решение было настолько простым, и я не думал об этом. Тоннельное видение, я думаю ... Поставьте его в качестве ответа, и я соглашусь с ним. – Mikk