Сохраняйте значения других столбцов постоянными после groupby и управления субфреймом данных - PullRequest
2 голосов
/ 09 июля 2020

Я хочу сгруппировать dfx по Branch и Buyer, получить строку, где Quantity - среднее значение в каждом подфрейме данных, и вернуть окончательный фрейм данных. Как я могу сохранить соответствующее значение в столбце Date?

dfx:

  Branch Buyer  Quantity                Date
0      A  Carl         1 2013-01-01 13:00:00
1      A  Mark         3 2013-01-01 13:05:00
2      A  Carl         5 2013-10-01 20:00:00
3      A  Carl         1 2013-10-02 10:00:00
4      A   Joe         8 2013-10-01 20:00:00
5      A   Joe         1 2013-10-02 10:00:00
6      A   Joe         9 2013-12-02 12:00:00
7      B  Carl         3 2013-12-02 14:00:00

Воспроизводимый образец:

 dfx = pd.DataFrame({'Branch': 'A A A A A A A B'.split(),
   'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(),
   'Quantity': [1, 3, 5, 1, 8, 1, 9, 3],
   'Date': [
   datetime.datetime(2013, 1, 1, 13, 0),
   datetime.datetime(2013, 1, 1, 13, 5),
   datetime.datetime(2013, 10, 1, 20, 0),
   datetime.datetime(2013, 10, 2, 10, 0),
   datetime.datetime(2013, 10, 1, 20, 0),
   datetime.datetime(2013, 10, 2, 10, 0),
   datetime.datetime(2013, 12, 2, 12, 0),
   datetime.datetime(2013, 12, 2, 14, 0)]
   })

Использование:

grouped1 = dfx.groupby(['Branch', 'Buyer'])
grouped1['Quantity'].apply(lambda x: x.iloc[0])

возвращается:

Branch  Buyer
A       Carl     1
        Joe      8
        Mark     3
B       Carl     3
Name: Quantity, dtype: int64

, но не сохраняет Date.

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

  Branch Buyer  Quantity                Date
0      A  Carl         1 2013-01-01 13:00:00  
1      A  Mark         3 2013-01-01 13:05:00

4      A   Joe         8 2013-10-01 20:00:00

7      B  Carl         3 2013-12-02 14:00:00

Для (A,Carl) есть только два уникальных значения 1 и 5, но 1 появляется первым, поэтому сохраните это строка. (A,Joe) имеет 8, 1, 9, поэтому оставим строку со средним значением 8. (A,Mark) и (B,Carl) содержат только одну строку, поэтому исходные данные сохраняются.

Ответы [ 2 ]

3 голосов
/ 09 июля 2020

Groupby Extended

Чтобы получить средний элемент Quantity, вы можете взять первый и последний индексы и разделить их на 2, чтобы получить средний индекс. В соответствии со значением Quantity вы получите столбец Date, просто указав имя столбца, т.е. Date после groupby, как показано выше.

1 голос
/ 09 июля 2020

Используйте настраиваемую функцию с получением индексов разницы с медианными и абсолютными значениями с помощью Series.idxmin, а затем выберите строки DataFrame.loc:

f = lambda x: x.sub(x.median()).abs().idxmin()
df = dfx.loc[dfx.groupby(['Branch', 'Buyer'], sort=False)['Quantity'].apply(f)]
print (df)
  Branch Buyer  Quantity                Date
0      A  Carl         1 2013-01-01 13:00:00
1      A  Mark         3 2013-01-01 13:05:00
4      A   Joe         8 2013-10-01 20:00:00
7      B  Carl         3 2013-12-02 14:00:00
...