pandas groupby и получает только значения, когда весь столбец согласован для каждой группы

#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))