Pandas Dataframe to pivot table - 根据前两列的添加创建新列

Posted

技术标签:

【中文标题】Pandas Dataframe to pivot table - 根据前两列的添加创建新列【英文标题】:Pandas Dataframe to pivot table - Make new column based off the addition of the previous two columns 【发布时间】:2022-01-22 10:38:52 【问题描述】:

我有一个 pandas 数据框,其中的列是按月四舍五入的日期。每个月有两栏,一栏是预期数量,另一栏是实际数量。这些行都是产品项目。它基本上是预测数据,如果您从事供应链工作,您就会明白我的意思。

我想要做的是对于每个月的列,从上个月列的预期中减去实际数量,然后将预期的当前月份列添加到预期的当前月份的总数中,然后将其放入该月的新列中的值。 我希望能够在数据框中的所有月份都这样做。

如果我没有很好地解释它,基本上我有一个月的产品预期,并且我有那个月的销售量。我想将它们彼此相减,并将其延续到下个月(以及之后的每个月),以查看我在任何给定月份对该项目的评价是积极的还是消极的。

这可能吗?

编辑:添加更多信息以供使用:

data = np.array([['2020-08-01',"10", "5", "item1", 'AF'],
                ['2020-08-01', "2", "4", "item1", "QF"],
                ['2020-09-01', "15", "30", "item1", "AF"],
                ['2020-09-01', "10", "5", "item1", "QF"]])
df = pd.DataFrame(data=data, columns=['Month', 'ExpectedQty', 'ActualQty', 'ProductID', 'Warehouse'])

pivot_table = df.pivot_table(columns=df.Month,
                            values=['ActualQty', 'ExpectedQty'],
                            index=[df['ProductID'], df['Warehouse']],
                            fill_value='')
pivot_table.columns = pivot_table.columns.swaplevel(0, 1)
pivot_table.sort_index(axis=1, level=0, inplace=True)

如何将上面代码中的“pivot_table”变成下面想要的样子?

          Date       |           2020-08-01        |          2020-09-01           |
          Quantities | Expected | Actual | New Col | Expected | Actual |  New Col  |
                             
ProductID | Warehouse 
item1     |   AF     |      10  |    5   |    -5   |    15    |   30   |     10    |
              QF     |      2   |    4   |     2   |    10    |    5   |     -3    |
item2 ...

【问题讨论】:

请添加一些示例数据和所需的输出 今晚我会这样做。我现在不在。 到那时你的问题才会得到回答:( 添加了数据和所需的输出。如果有更好的方法让我知道,我不经常使用 ***。 @ZLi 和 @GenericName 最好把它们写成代码而不是截图,比如data=pd.DataFrame... 【参考方案1】:
# your code for data with three months
data = np.array([['2020-08-01',"10", "5", "item1", 'AF'],
                ['2020-08-01', "2", "4", "item1", "QF"],
                ['2020-09-01', "15", "30", "item1", "AF"],
                ['2020-09-01', "10", "5", "item1", "QF"],
                ['2020-10-01', "10", "5", "item1", "AF"],
                ['2020-10-01', "10", "5", "item1", "QF"]])
df = pd.DataFrame(data=data, columns=['Month', 'ExpectedQty', 'ActualQty', 'ProductID', 'Warehouse'])
df[['ExpectedQty', 'ActualQty']] = df[['ExpectedQty', 'ActualQty']].astype('float')

# calculate new col
df = df.sort_values('Month')
df['QtyDiff'] = df['ActualQty'] - df['ExpectedQty']
df['QtyDiff_cumsum'] = df.groupby(['ProductID', 'Warehouse'])['QtyDiff'].cumsum()
df['New Col'] = df['QtyDiff_cumsum']
# get pivot table
pivot_table = df.pivot_table(columns='Month',
                             values=['ActualQty', 'ExpectedQty', 'New Col'],
                             index=['ProductID', 'Warehouse'],
                             fill_value='')
pivot_table.columns = pivot_table.columns.swaplevel(0, 1)
pivot_table.sort_index(axis=1, level=0, inplace=True)
pivot_table

输出:输出太长,所以我放一张图在这里:

【讨论】:

太棒了!这有效并且按照我的要求进行。感谢您花时间向我展示如何做到这一点。 :-) 嘿 Z Li,我刚刚应用了您提供的代码,它适用于我提供的示例数据,但在我的总结中我说我希望能够继续每月添加“新 col” .我只在示例数据中放了 2 个月,并没有每个月都放,因为那会很长。话虽如此,您的代码仅适用于 2 列,并且每隔一列重置一次。 “新col”数据如何每个月都持续存在?月数是动态的。 嗨@GenericName,是的,你是对的。在这种情况下,它实际上更容易。请参阅更新的答案。它应该可以工作任意几个月。 哇...就这么简单?伙计,我绞尽脑汁想弄清楚如何用 pandas 优雅地做到这一点,我放弃了,最后用 for 循环以一种丑陋的蛮力方式做到了,因为我不认为你会回来更新你的答案。哈哈,它只是一个单词的功能......我有很多关于熊猫的知识。感谢您更新您的答案,这非常有帮助。

以上是关于Pandas Dataframe to pivot table - 根据前两列的添加创建新列的主要内容,如果未能解决你的问题,请参考以下文章

Pivot一个多列的pandas数据框架。

R语言将dataframe数据从长表(long)变为宽表(wide)实战:tidyr包的spread函数cdata包的pivot_to_rowrecs函数data.table包dcast函数

使用 pandas.DataFrame.to_csv() 按列输出不同的精度?

`pandas.DataFrame.to_html()` 没有 `table border` 和 `tr style`

6 ways to Sort Pandas Dataframe: Pandas Tutorial

pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序