Python 中的 Pivot Dataframe - 股票市场分析
Pivot Dataframe in Python - stock market analysis
我有 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
我从将字典转换为数据框开始,然后使用 pivot_table 来实现我需要的。
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
有人可以帮忙吗?
谢谢。
您错过了融化步骤。试试下面的代码,然后简单地重命名您的列!
stockDict = {'Owned' : ['CTSH', 'GOOGL'],'Wishlist' : ['LAZY', 'AIRG', 'CLSK', 'CTSH']}
df = pd.DataFrame.from_dict(stockDict, orient = 'index')
df.T.melt()
使用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
我有 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
我从将字典转换为数据框开始,然后使用 pivot_table 来实现我需要的。
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
有人可以帮忙吗?
谢谢。
您错过了融化步骤。试试下面的代码,然后简单地重命名您的列!
stockDict = {'Owned' : ['CTSH', 'GOOGL'],'Wishlist' : ['LAZY', 'AIRG', 'CLSK', 'CTSH']}
df = pd.DataFrame.from_dict(stockDict, orient = 'index')
df.T.melt()
使用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