繁体   English   中英

在pandas数据框中获取组内项目索引的最有效方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM