我想基于单列两行的差异对数据框进行排序

时间:2019-06-11 06:26:08

标签: python pandas sorting dataframe

我有一个数据框。

      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

2 个答案:

答案 0 :(得分:3)

首先,您需要计算每种物料类型的差异。使用熊猫来做到这一点的方法之一就是使用pivot_tables。在这里,您可以根据要计算的列(values =“ TotalCost”),要使用什么函数来计算该数据帧(df)(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")]]

另一种选择是您计算月份的平均差异。可以使用以下功能完成此操作,然后将其替换为:

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

答案 1 :(得分: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
相关问题