我有python字典
stockDict = {
'Owned' : ['CTSH', 'GOOGL'],
'Wishlist' : ['LAZY', 'CTSH', 'AAPL']
}
:更新了字典以使其值具有不同的数组大小。 @Youness Sadaan的解决方案效果很好!
我想将其转换为如下所示的数据框:
stockCode Remarks
0 CTSH Owned
1 GOOGL Owned
2 LAZY Wishlist
3 CTSH Wishlist
3 AAPL Wishlist
我首先将字典转换为数据框,然后使用数据透视表实现所需的功能。
stockDf = pd.DataFrame(columns = ["stockCode", "Remarks"])
df = pd.DataFrame([(k, *v) for k, v in stockDict.items()])
df.columns = ['Remarks'] + [f'stock{x}' for x in df.columns[1:]]
display(df)
在这一点上,我对如何实现所需的输出感到困惑。
pd.pivot_table(df, values=['stock1', 'stock2', 'stock3', 'stock4'], index=None, columns='Remarks', aggfunc='first')
提供以下信息:
Remarks Owned Wishlist
stock1 CTSH LAZY
stock2 GOOGL AIRG
stock3 None CLSK
stock4 None CTSH
有人可以帮忙吗?
谢谢。
答案 0 :(得分:0)
您错过了熔化步骤。尝试以下代码,然后只需重命名您的列即可!
stockDict = {'Owned' : ['CTSH', 'GOOGL'],'Wishlist' : ['LAZY', 'AIRG', 'CLSK', 'CTSH']}
df = pd.DataFrame.from_dict(stockDict, orient = 'index')
df.T.melt()
答案 1 :(得分:0)
使用melt()
函数会更好,更容易。
我编辑了您的代码以提供所需的相同输出:
stockDict = {'Owned' : ['CTSH', 'GOOGL'],'Wishlist' : ['LAZY', 'AIRG', 'CLSK', 'CTSH']}
stockDf = pd.DataFrame(columns = ["stockCode", "Remarks"])
df = pd.DataFrame([(k, *v) for k, v in stockDict.items()])
df.columns = ['Remarks'] + [f'stock{x}' for x in df.columns[1:]]
df3=df.melt(id_vars=['Remarks'], value_vars=['stock1', 'stock2','stock3','stock4'],value_name='stockCode')[['Remarks','stockCode']]
df3=df3.sort_values(by=['Remarks'])
display(df3)
输出:
Remarks stockCode
0 Owned CTSH
2 Owned GOOGL
4 Owned None
6 Owned None
1 Wishlist LAZY
3 Wishlist AIRG
5 Wishlist CLSK
7 Wishlist CTSH