Добавление столбца в фрейм данных Pandas на основе других столбцов - PullRequest
2 голосов
/ 11 ноября 2019

Описание проблемы

Вводное замечание: код приведен ниже

Допустим, у нас есть кадр данных pandas, состоящий из 3 столбцови 2 ряда. Я хотел бы добавить 4-й столбец с именем Max_LF, который будет состоять из массива. Значение ячейки можно получить, посмотрев на столбец Max_WD. Для первой строки это будет 0,35, которое будет сравниваться со значениями в столбце «WD», где 0,35 можно найти в третьей позиции. Следовательно, третье значение столбца «LF» должно быть записано в столбец «Max_LF». Если значение «Max_WD» встречается несколько раз в «WD», то все соответствующие элементы «LF» должны быть записаны в «Max_LF».

Неудачная попытка

До сих пор у меня были различные попытки сначала получить индекс элемента в «Max_WD» в «WD». После потенциального получения индекса идея заключалась в том, чтобы затем получить элементы «LF» через их индекс: df4['temp_indices'] = [i for i, x in enumerate(df4['WD']) if x == df4['Max_WD']]

Однако произошла ошибка ValueError: повысить ValueError («Длина должна совпадать для сравнения») ValueError: Lengthsдолжен совпадать для сравнения

Вот так выглядит пример даты

df = pd.DataFrame(data={'LF': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] , 'WD': [[0.28, 0.34, 0.35, 0.18], [0.42, 0.45, 0.45, 0.18], [0.31, 0.21, 0.41, 0.41]], 'Max_WD': [0.35, 0.45, 0.41]})

Ожидаемый результат должен выглядеть как

df=pd.DataFrame(data={'LF': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] , 'WD': [[0.28, 0.34, 0.35, 0.18], [0.42, 0.45, 0.45, 0.18], [0.31, 0.21, 0.41, 0.41]], 'Max_WD': [0.35, 0.45, 0.41], 'Max_LF': [[3] ,[2,3], [3,4]]})

1 Ответ

0 голосов
/ 11 ноября 2019

Вы можете добиться этого, применяя функцию по оси 1 .

. Для этого я рекомендую сначала преобразовать список WD в pd.Series (или numpy.ndarray). ) и затем сравните все значения сразу.

Предполагая, что вы хотите получить список всех значений, превышающих пороговое значение, вы можете использовать это:

>>> def get_max_wd(x): 
...     wd = pd.Series(x.WD) 
...     return list(wd[wd >= x.Max_WD])
... 
>>> df.apply(get_max_wd, axis=1)
0          [0.35]
1    [0.45, 0.45]
2    [0.41, 0.41]
dtype: object

Результат apply затем может быть назначен как новый столбец в кадре данных:

df['Max_LF'] = df.apply(get_max_wd, axis=1)

Если то, что вы ищете, является только максимальным значением (см. Мой комментарий выше), вы можете использовать метод max() в пределахфункция.

...