Вопрос:

Я хочу отсортировать фрейм данных на основе разницы двух строк одного столбца

python pandas sorting dataframe

51 просмотра

2 ответа

29 Репутация автора

У меня есть датафрейм.

      Item Type            Year_Month   Total Cost
        Cereal             Jul-2017     6000
        Cereal             Jun-2017     5000
     Baby Food             Jul-2017     3000
    Baby Food              Jun-2017     2900 
        Snacks             Jul-2017     4500
       Snacks              Jun-2017     4000

Я хочу отсортировать данные в соответствии с разницей двух строк одного столбца. Например, для зерновых разница составляет 6000-5000 = 1000, а для закусок - 4500-4000 = 500, а для детского питания - 3000-2900 = 100.

Таким образом, вывод должен быть как

  Item Type            Year_Month   Total Cost
    Cereal             Jul-2017     6000
    Cereal             Jun-2017     5000
    Snacks             Jul-2017     4500
   Snacks              Jun-2017     4000
 Baby Food             Jul-2017     3000
Baby Food              Jun-2017     2900
Автор: Kanika Singhal Источник Размещён: 11.06.2019 06:26

Ответы (2)


2 плюса

19 Репутация автора

Вы можете попробовать этот код.

df['diff'] = df.groupby('Item_Type').diff(periods=-1)

df.loc[df['diff'].isnull(),'diff'] = df['diff'].shift(1)

df = df.sort_values(by = ['diff'], ascending = False)

df = df.drop(columns = 'diff')

df
Автор: Raymond Toh Размещён: 11.06.2019 07:45

3 плюса

46 Репутация автора

Сначала вам нужно рассчитать различия для каждого типа элемента. Одним из способов, как это сделать с пандами, было бы использование pivot_tables. Здесь вы указываете, какой именно фрейм данных (df), на основе каких столбцов рассчитывать (values ​​= "TotalCost"), какую функцию использовать для его вычисления (aggfunc = np.diff) и как их группировать (index = ["ItemType" ]).

diff = pandas.pivot_table(df, values="TotalCost", index=["ItemType"], aggfunc=np.diff)

У вашего случая выше есть только 2 возможных месяца. Если у вас их больше двух, то np.diff выдаст вам значения в списке. В этом случае у вас есть два варианта. Либо вы фильтруете фрейм данных, так что в нем всего два месяца. Это можно сделать так:

df = df[[a or b for a, b in zip(df["Year_Month"] == "Jul-2017", df["Year_Month"] == "Jun-2017")]]

Другой вариант заключается в том, что вы рассчитываете среднюю разницу в месяцах. Это можно сделать с помощью следующей функции, которую вы затем замените на np.diff:

def mean_diff(l):
    return np.mean(np.diff(l))

Затем вы можете использовать это для расчета разницы для каждого элемента:

df["Diff"] = [float(diff.loc[d]) for d in df["ItemType"]]

После этого вы просто сортируете по разнице (а затем по элементу, если есть несколько элементов с одинаковой разницей)

df.sort_values(by=["Diff", "ItemType", "Year_Month"]).drop(columns = 'Diff')
Автор: sarajaksa Размещён: 11.06.2019 08:16
Вопросы из категории :
32x32