Python 根据数据帧中的值计算增量
我有这个数据帧(这只是一个示例,不是真实的数据): 我想要的是计算每两个月购买的增量项目。也就是说,例如,客户“001”在2月(20日)购买的物品比1月(10日)多10件。客户'002'购买了10件物品(2月20日、1月30日)。最终的数据帧如下所示:Python 根据数据帧中的值计算增量,python,pandas,dataframe,Python,Pandas,Dataframe,我有这个数据帧(这只是一个示例,不是真实的数据): 我想要的是计算每两个月购买的增量项目。也就是说,例如,客户“001”在2月(20日)购买的物品比1月(10日)多10件。客户'002'购买了10件物品(2月20日、1月30日)。最终的数据帧如下所示: In [3]: delta_df Out [3]: client_id delta_items_feb delta_items_mar 0 001
In [3]: delta_df
Out [3]:
client_id delta_items_feb delta_items_mar
0 001 10 10
1 002 -10 -5
2 003 10 -5
有什么想法吗?这里有一种方法,使用
pivot\u table
首先按客户和月份对项目计数进行分组:
1) clietn_id to set. Set to list client_listand sorted ['001','002','003'] .
2) month string to int Jan-1;Feb-2;Mar -3 and etc
3) for client in client_listand:
For every client create new list
for line in you_date:
When ides of clients coincide, add to the list #filter by client_id
sorted result by month
in the loop from data of one client generate the lines of outgoing table.
delta_items_mar = item[n]-item[n-1]
(我首先用df.items=df.items.astype(int)
将items
列转换为整数)
注意:在pandas的较新版本中,在创建透视表时使用索引
/列
,而不是行
/列
这:
- 按客户端和日期透视数据,以显示每个客户端的项目计数
- 确保表中的列按月份正确排序
- 使用
计算连续月份之间的差异,并使用所需的列名创建新的数据框np.diff
>>> df['deltas'] = df.groupby('client_id')\
.apply(lambda x: x['items'].astype(int).diff()).values
client_id items month deltas
0 001 10 Jan NaN
1 001 20 Feb 10
2 001 30 Mar 10
3 002 30 Jan NaN
4 002 20 Feb -10
5 002 15 Mar -5
6 003 10 Jan NaN
7 003 20 Feb 10
8 003 15 Mar -5
最后,将其放到您想要删除一月专栏的表单:
>>> df.pivot(index='client_id', columns='month', values='deltas')\
.drop('Jan', axis=1)
month Feb Mar
client_id
001 10 10
002 -10 -5
003 10 -5
不花哨,但这是对我有用的
#change 'items' from string to int
## use loc to avoid "slice" warning
df.loc[:,"items"] = df["items"].map(int)
# use pivot to make columns for each unique value in "month" column
dfp = df.pivot('client_id','month','items')
# calculate delta and put in a new column
dfp["dJF"] = dfp.Feb - dfp.Jan
给予
似乎我们找到了相同的解决方案(pivot+diff),但顺序不同;-)所以我们做了:-)我想我最初尝试了
groupby
,但没有想到如何最好地在这里使用它,所以很高兴看到您的解决方案。我在执行“df['deltas']=df.groupby('client_id').apply(lambda x:x['items'].astype(int.diff()).ValueError:value的长度与索引的长度不匹配”时遇到了这个错误。看不出原因…将df.groupby('client_id').apply(lambda x:x['items'].astype(int.diff()).values
的输出与原始df
进行比较,以查看导致差异的原因。它在my pandas 0.15.1上使用您的示例数据运行正常。运行df.groupby('client_id')后,我得到一个3x3数组。应用(lambda x:x['items'].astype(int.diff())。值
和差异值。也许这就是为什么我不能将df['delta']
分配给数组的原因?我的熊猫版本是0.14.1这很奇怪,看起来你不仅得到了值,还得到了索引?您使用的是相同的测试数据还是错误出现在新数据中?我使用的是相同的测试数据(只是检查了两次)。我得到的数组是数组([[nan,10,10.],[nan,-10.,-5.],[nan,10.,-5.])
。该df.groupby…
语句的期望输出是什么?
>>> df.pivot(index='client_id', columns='month', values='deltas')\
.drop('Jan', axis=1)
month Feb Mar
client_id
001 10 10
002 -10 -5
003 10 -5
#change 'items' from string to int
## use loc to avoid "slice" warning
df.loc[:,"items"] = df["items"].map(int)
# use pivot to make columns for each unique value in "month" column
dfp = df.pivot('client_id','month','items')
# calculate delta and put in a new column
dfp["dJF"] = dfp.Feb - dfp.Jan
month Feb Jan Mar dJF
client_id
001 20 10 30 10
002 20 30 15 -10
003 20 10 15 10