我是熊猫新手。我有一个数据框,可以跟踪许多产品的销售单位和相关价格。我想为所有产品创建行,直到第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
我可以重复执行价格代码,然后合并两个数据框,以实现所需的结果。但是,如果我想复制很多列,这看起来很不美观,效率很低。如何更优雅地获得期望的结果或如何利用高级熊猫功能?
答案 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