![](/img/trans.png)
[英]Most efficient way to calculate the mean of a group of columns in a pandas DataFrame
[英]Most Efficient way to get index of item within a group in pandas dataframe
我有一个长格式的数据集,我需要将其转换为宽格式,但首先需要创建列名。 原始数据集如下所示:
Item Date Cost
---- ----------- -----
1102 10-12-2011 $1.00
1102 10-18-2011 $8.00
1102 10-15-2011 $11.00
1103 10-16-2011 $3.00
1104 11-18-2011 $7.00
1104 11-15-2011 $5.00
我想将数据集转换为如下形式:
Item charge_0 charge_1 charge_2
---- -------- -------- --------
1102 1.00 11.00 8.00
1103 3.00 NaN NaN
1104 5.00 7.00 NaN
费用编号(列名)指示每个项目的费用接收顺序(最早的日期在前)。
我有一些代码可以工作,但是它确实很慢而且很笨拙。 我正在使用的数据集有几百万行,我需要在更大的数据集上使用代码,因此效率很重要。
# Sort dataframe by Item and Date
df_sorted=df.sort_values['Item','Date'], ascending=[1,1])
df_sorted.reset_index(drop=True, inplace=True)
# Get the order or charges (based on date) for each item
df_cost=df_sorted.groupby('Item').apply(lambda x:x['Cost']
.reset_index()).reset_index()
df_cost['colName']='charge_' + df_cost['level_1'].astype(str)
# Transform data from long to wide format
df_long=df_cost.pivot(index='Item', columns='colName', values='Cost')
任何建议或意见,将不胜感激。 谢谢妮可
您可以从cumcount获取费用编号:
In [11]: df["charge"] = df.groupby(["Item"]).cumcount()
In [12]: df.pivot_table("Cost", index="Item", columns="charge", aggfunc=lambda x: x)
Out[12]:
charge 0 1 2
Item
1102 $1.00 $8.00 $11.00
1103 $3.00 NaN NaN
1104 $7.00 $5.00 NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.