Python 熊猫-创建值不同的列
我有下面的数据集。如何创建一个新的列来显示每个人在每次到期时的资金差异 这列是黄色的,这就是我想要的。你可以看到,这是一个人的每个到期点在金钱上的差异。我用颜色突出显示了其他行,因此更清晰 非常感谢 [] 结果:Python 熊猫-创建值不同的列,python,pandas,Python,Pandas,我有下面的数据集。如何创建一个新的列来显示每个人在每次到期时的资金差异 这列是黄色的,这就是我想要的。你可以看到,这是一个人的每个到期点在金钱上的差异。我用颜色突出显示了其他行,因此更清晰 非常感谢 [] 结果: Day Name Money_x Expiry Difference 0 2020-08-30 John 100 1Y 50 1 2020-08-30 Mike 950 1Y 90
Day Name Money_x Expiry Difference
0 2020-08-30 John 100 1Y 50
1 2020-08-30 Mike 950 1Y 900
2 2020-08-30 John 200 2Y -50
3 2020-08-30 Mike 1000 2Y -200
如果差异是从上一个日期衍生出来的,您可以在开始时定义一个日期变量,以查找今天(t)和前一天(t-1),以过滤掉原始数据帧。您可以使用
groupby.diff
以数据帧为例
df = pd.DataFrame({
'Day': [30, 30, 30, 30, 29, 29, 28, 28],
'Name': ['John', 'Mike', 'John', 'Mike', 'John', 'Mike', 'John', 'Mike'],
'Money': [100, 950, 200, 1000, 50, 50, 250, 1200],
'Expiry': [1, 1, 2, 2, 1, 1, 2, 2]
})
print(df)
看起来像
Day Name Money Expiry
0 30 John 100 1
1 30 Mike 950 1
2 30 John 200 2
3 30 Mike 1000 2
4 29 John 50 1
5 29 Mike 50 1
6 28 John 250 2
7 28 Mike 1200 2
代码呢
# make sure we have dates in the order we want
df.sort_values('Day', ascending=False)
# groubpy and get the difference from the next row in each group
# diff(1) calculates the difference from the previous row, so -1 will point to the next
df['Difference'] = df.groupby(['Name', 'Expiry']).Money.diff(-1)
输出
Day Name Money Expiry Difference
0 30 John 100 1 50.0
1 30 Mike 950 1 900.0
2 30 John 200 2 -50.0
3 30 Mike 1000 2 -200.0
4 29 John 50 1 NaN
5 29 Mike 50 1 NaN
6 28 John 250 2 NaN
7 28 Mike 1200 2 NaN
嗨,欢迎来到苏。。!!请创建一个可以通过代码复制的虚拟示例。您可以参考:对不起,当我将图像放入图像编辑器时,它只是粘贴了链接。您可以使用
df.head(10).to_dict('list')
获取您的样本。。。我看到第一行有diff50
,并假设这是因为该代码应该总是减去该名称到期的前一个日期,如果没有日期8-29
的Mike-1Y
的数据,你会减去他在8-28
上的任何钱吗?谢谢Richie。当我在原始数据帧中捕获最后7天时,将始终存在前一天的数据。编辑:你提到的内容是正确的,它应该总是减去以前的日期that@RichieV已经向您建议了将数据转换为代码片段的正确方法,请发布相同的代码片段,以便我们可以在我们的系统中复制数据,提前感谢。:)可能有一种更简单的方法来实现这一点,或者您可以在函数中执行上述操作,通过将日期定义为变量来实现更大的可伸缩性。我将尝试返回给您我正在尝试:df['Difference']=df.groupby(['Name','expiration']).df['Money'].diff(-1)。。。获取一个错误“DateFrameGroupBy”对象没有属性“df”检查它可能是什么
Day Name Money Expiry Difference
0 30 John 100 1 50.0
1 30 Mike 950 1 900.0
2 30 John 200 2 -50.0
3 30 Mike 1000 2 -200.0
4 29 John 50 1 NaN
5 29 Mike 50 1 NaN
6 28 John 250 2 NaN
7 28 Mike 1200 2 NaN