【发布时间】:2021-03-05 13:40:00
【问题描述】:
我正在努力重塑 pandas 数据框。基本上,我正在试验体育统计数据,并试图整理得分。我有一个数据框,其中列出了客队和主队以及他们的分数,所有这些都在这样的独特列中:
df = pd.DataFrame(data={'GameID': [1, 2], 'Date': ['9/10/2020', '9/13/2020'], 'Visitor': ['Houston Texans', 'Seattle Seahawks'], 'Score_V': [20,38], 'Home':['Kansas City Chiefs', 'Atlanta Falcons'], 'Score_H':[34,25]})
我正在重塑数据框,以便团队和分数都在他们自己的列中结束,所以我最终会得到这样的结果:
df2 = pd.DataFrame(data={'GameID': [1, 1, 2, 2], 'Date': ['9/10/2020', '9/10/2020', '9/13/2020', '9/13/2020'], 'Team': ['Houston Texans', 'Kansas City Chiefs', 'Seattle Seahawks', 'Atlanta Falcons'], 'Location':['Away', 'Home', 'Away', 'Home'], 'Score': [20,34,38,25]})
我想出了以下解决方案,我在其中融合了数据框并使用.loc() 逻辑来查找和替换各个列中的值。但我觉得这个解决方案不是很优雅,我错过了pandas.melt() 的一些明显功能。
df = df.melt(id_vars=['GameID','Date','Home','Visitor'])
df = df.rename(columns={"variable": "Location", "value": "Score"})
df.loc[df['Location'] == 'Score_V', 'Team'] = df['Visitor']
df.loc[df['Location'] == 'Score_V', 'Location'] = 'Away'
df.loc[df['Location'] == 'Score_H', 'Team'] = df['Home']
df.loc[df['Location'] == 'Score_H', 'Location'] = 'Home'
df = df.drop(columns=['Home', 'Visitor'])
还有比这更简单的解决方案吗?
【问题讨论】:
标签: python pandas dataframe reshape melt