在使用multiindex更新单列的同时创建重复的行

时间:2019-02-01 18:28:58

标签: pandas

我是熊猫新手。我有一个数据框,可以跟踪许多产品的销售单位和相关价格。我想为所有产品创建行,直到第12个月为止的几个月,然后复制“价格”和“单位”中的数据。

输入

df = pd.read_csv('input.csv', index_col=None)
print(df.to_string())

        name location  month  price  units
0  Product A        X     10   2.97      2
1  Product A        Y     10   2.67      3
2  Product B        X     10   2.67      4

输出

df

        name location  month  price  units
0  Product A        X     10   2.97      2
1  Product A        X     11   2.97      2
2  Product A        X     12   2.97      2
3  Product A        Y     10   2.67      3
4  Product A        Y     11   2.67      3
5  Product A        Y     12   2.67      3
6  Product B        X     10   2.67      4
7  Product B        X     11   2.67      4
8  Product B        X     12   2.67      4

我认为我需要根据“名称”,“位置”和“月”创建一个MultiIndex。我能够为一列创建所需的效果,但不能同时创建多个。

我为简单单位创建代码的代码是:

df = df.set_index(['name', 'location', 'month'])
u = df.units.unstack()

for i in range(10,13):
    u[i] = u[10]

u = u.stack().reset_index()
u = u.rename(columns={0:'units'})
u

产生的结果

        name location  month  units
0  Product A        X     10      2
1  Product A        X     11      2
2  Product A        X     12      2
3  Product A        Y     10      3
4  Product A        Y     11      3
5  Product A        Y     12      3
6  Product B        X     10      4
7  Product B        X     11      4
8  Product B        X     12      4

我可以重复执行价格代码,然后合并两个数据框,以实现所需的结果。但是,如果我想复制很多列,这看起来很不美观,效率很低。如何更优雅地获得期望的结果或如何利用高级熊猫功能?

1 个答案:

答案 0 :(得分:1)

IIUC,可能类似于以下内容:

months = list(range(1,13))
a = 13-df.loc[df.month.isin(months),'month']
df_new=pd.DataFrame(np.repeat(df.values,a,axis=0),columns=df.columns)

df_new.month=df_new.groupby(['name','location'])['month'].apply(lambda x : (x.duplicated().cumsum()+df_new.month).dropna())

print(df_new)


         name    location  month price units
0   Product A       X         10  2.97     2
1   Product A       X         11  2.97     2
2   Product A       X         12  2.97     2
3   Product A       Y         10  2.67     3
4   Product A       Y         11  2.67     3
5   Product A       Y         12  2.67     3
6   Product B       X         10  2.67     4
7   Product B       X         11  2.67     4
8   Product B       X         12  2.67     4