我想根据一列中两行的差异对数据帧进行排序

2024-03-28 10:55:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧。你知道吗

      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

Tags: 数据食品foodtypeitemyearjunjul
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

首先,您需要计算每个项目类型的差异。其中一种方法,如何做到这一点,熊猫将是使用pivot表。这里告诉它哪个数据帧(df),基于哪个列来计算(values=“TotalCost”),使用哪个函数来计算它(aggfunc=np.差异)以及如何对它们进行分组(index=[“ItemType”])。你知道吗

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

你的上述情况只有2个月的可能。如果你有两个以上,那么np.差异会给你一个列表中的值。在这种情况下,您有两种选择。要么你过滤数据框,所以只有两个月的时间。可以这样做:

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

另一种选择是计算月平均差。这可以通过以下函数来完成,然后将其替换为np.差异使用:

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

相关问题 更多 >