#python #pandas-groupby
#python #pandas-groupby
Вопрос:
У меня есть фрейм данных элементов с двумя разными идентификаторами. id1 и id2, где id2 действительно уникален и может быть несколько id2 для одного id1. Функции элемента специфичны для id2s.
df = pd.DataFrame([[111, 12345, "A", "red", "big"],
[111, 12399, "A", "red", "small"],
[222, 345, "B", "red", "small"],
[222, 349, "B", "blue", "small"]],
columns=["id1", "id2", "feature1", "feature2", "feature3"]
id1 id2 feature1 feature2 feature3
0 111 12345 A red big
1 111 12399 A red small
2 222 345 B red small
3 222 349 B blue small
Я хочу сгруппировать по id1 и получить постоянные значения в столбцах, только когда все строки в группе имеют одинаковое значение в этом столбце, иначе NaN. Итак, ожидаемый результат в приведенном выше примере :
id2 feature1 feature2 feature3
id1
111 NaN A red NaN
222 NaN B NaN small
Я написал эту функцию, которую хочу применить к сгруппированному объекту, но она не работает таким образом:
def consistent(series):
if series.nunique() == 1:
return series.iloc[0]
else:
return np.nan
df1.groupby("id1").apply(consistent)
Что я делаю не так?
Ответ №1:
Вы можете попробовать это с :
import numpy as np
df.groupby("id1").agg(lambda x: np.nan if len(set(x)) != 1 else list(set(x))[0])
Вывод этого кода :
id1 id2 feature1 feature2 feature3
111 NaN A red NaN
222 NaN B NaN small
Надеюсь, это поможет
Комментарии:
1. Спасибо! Мне нравится ваш ответ больше, поскольку это более лаконичное решение, чем написание дополнительной функции, но я выбрал ответ @Ave799, поскольку он решил для меня, как правильно использовать .apply() .
Ответ №2:
Используйте ниже:
df.groupby("id1").apply(lambda x: x.apply(consistent))