【问题标题】:I want to sort a dataframe based on the difference of two rows of a single column我想根据单列的两行的差异对数据框进行排序
【发布时间】:2019-06-13 05:21:37
【问题描述】:

我有一个数据框。

      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

【问题讨论】:

  • 使用df.sort_values(by=['Cost'], ascending=False)
  • 你可以介绍更复杂的例子。

标签: python pandas sorting dataframe


【解决方案1】:

首先,您需要计算每种商品类型的差异。其中一种方法是使用 pandas 执行此操作是使用 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')

【讨论】:

  • IT 抛出一个错误,即在使用 np.diff 的情况下必须产生聚合值。如果我用 np.mean 或 np.sum 替换它,它不会抛出任何错误?
  • 表中是否有多个月份(超过两个)?在这种情况下,np.diff 将为您提供值列表,而 np.mean 和 np.sum 将为您提供一个元素。
【解决方案2】:

你可以试试这个代码。

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

【讨论】:

  • 我们为什么要移动数据框?
  • 基本上,我正在复制该值以替换 NaN 值。
最近更新 更多