我有一个包含更多产品描述的数据框。
data = {'product': ['1234', '5678'],
'descriptionOLD': ['old1234', 'old5678'],
'descriptionNEW': ['new1234', 'new5678'],
'descriptionFUTURE': ['future1234', 'future5678'],
}
如何以这种格式拆分此数据帧?
product type description
1234 descriptionOLD old1234
1234 descriptionOLD old5678
1234 descriptionNEW new1234
1234 descriptionNEW new5678
1234 descriptionFUTURE future1234
1234 descriptionFUTURE future5678
...
到目前为止我已经尝试过:
df=pd.DataFrame(data)
df['type']=''
df['description']=''
for id, row in df.iterrows():
df['type'][id]='descriptionOLD'
df['description'][id]=row['descriptionOLD']
df.pop('descriptionOLD')
df.pop('descriptionNEW')
df.pop('descriptionFUTURE')
它给了我这个结果:
product type description
0 1234 descriptionOLD old1234
1 5678 descriptionOLD old5678
但我不知道如何处理新的和未来的描述以实现所需的数据帧。
答案 0 :(得分:2)
尝试通过 filter()
方法过滤列,join()
方法返回“产品”列,最后使用 melt()
方法:
out=(df.filter(like='description')
.join(df['product'])
.melt(id_vars='product',var_name='type',value_name='description'))
或
尝试通过 filter()
方法过滤列,set_index()
方法保留“产品”,reset_index()
使产品返回列,最后使用 melt()
方法:< /p>
out=(df.set_index('product')
.filter(like='description')
.reset_index()
.melt(id_vars='product',var_name='type',value_name='description'))
或
根据 @NK03
的建议,您还可以使用 filter()
和 stack()
的组合:
out=(df.set_index('product')
.filter(like='description')
.stack()
.reset_index(name ='description')
.rename(columns = {'level_1' : 'type'}))