Python 如何转换数据帧列
我正在尝试转换从外部API中提取的数据。到目前为止,我的数据框架如下所示:Python 如何转换数据帧列,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试转换从外部API中提取的数据。到目前为止,我的数据框架如下所示: Country Date Team Rating United Kingdom 11/8/2019 Team A 95 United Kingdom 2/20/2019 Team B 90 United Kingdom 9/22/2017 Team A 90 United Kingdom 6/28/2016 Team B 90 United Kingdo
Country Date Team Rating
United Kingdom 11/8/2019 Team A 95
United Kingdom 2/20/2019 Team B 90
United Kingdom 9/22/2017 Team A 90
United Kingdom 6/28/2016 Team B 90
United Kingdom 6/27/2016 Team C 90
United Kingdom 6/24/2016 Team A 95
United Kingdom 6/12/2015 Team C 100
United Kingdom 6/13/2014 Team C 100
United Kingdom 4/19/2013 Team B 95
United Kingdom 2/22/2013 Team A 95
United Kingdom 12/13/2012 Team C 100
United Kingdom 3/14/2012 Team B 100
United Kingdom 2/13/2012 Team A 100
United Kingdom 10/26/2010 Team C 100
United Kingdom 5/21/2009 Team C 100
United Kingdom 9/21/2000 Team B 100
United Kingdom 9/21/2000 Team B 100
United Kingdom 8/10/1994 Team B 100
United Kingdom 6/26/1989 Team C 100
United Kingdom 4/28/1978 Team C 100
United Kingdom 3/31/1978 Team A 100
我希望它看起来像这样,但我正在努力弄清楚如何(我还是数据帧新手):
因此,本质上我希望国家和日期列保持不变,但是与每行只有一个团队不同,我希望所有团队都显示为列。我希望在未更新时使用它们以前的值,而不是空白值 例如,对于2019年11月8日,您可以在我的原始df中看到,只有A队的评级发生了变化。对于TeamB和TeamC列,如果没有更新,我希望它们使用以前的值
有人有什么建议吗?首先,如果需要对日期时间进行排序,我建议使用日期的
YYYYMMDD
字符串表示法(例如,第一条记录为20191108
),或者使用实际的datetime
数据类型。使用美式符号很容易混淆,也不容易分类
在任何情况下,为了解决您的问题,我建议先使用pandas函数,然后使用fill NaN(即)函数和回填(即bfill
)方法
编辑:如果要保留国家
列,则将其用作日期
列的多索引似乎无法与透视
配合使用。您可以做的是保留原始的df
,并在Date
列中将其与新的df连接起来
import pandas as pd
import datetime as dt
# Create DataFrame similar to example
df = pd.DataFrame(data={'Date': ['11/8/2019','2/20/2019','9/22/2017','6/28/2016','6/27/2016','6/24/2016','6/12/2015','6/13/2014'],
'Team': ['Team A','Team B','Team A','Team B','Team C','Team A','Team C','Team C'],
'Rating': [95,90,90,90,90,95,100,100]})
# Convert strings to datetimes
df['Date'] = df['Date'].map(lambda x: dt.datetime.strptime(x, '%m/%d/%Y'))
df['Country'] = 'United Kingdom'
# Pivot DataFrame
dfp = df.pivot(columns='Team', values='Rating')
# Join with Country from original df
dfp = df[['Date', 'Country']].join(dfp)
# sort descending on Date
dfp.sort_values(by='Date', ascending=False, inplace=True)
# dfp is:
# Date Country Team A Team B Team C
# 2019-11-08 United Kingdom 95.0 NaN NaN
# 2019-02-20 United Kingdom NaN 90.0 NaN
# 2017-09-22 United Kingdom 90.0 NaN NaN
# ...
# Fill NaN values using the "next" row value
dfp.fillna(method='bfill', inplace=True)
# dfp is:
# Date Country Team A Team B Team C
# 2019-11-08 United Kingdom 95.0 90.0 90.0
# 2019-02-20 United Kingdom 90.0 90.0 90.0
# 2017-09-22 United Kingdom 90.0 90.0 90.0
# ...
基本上,您需要的是:
data.pivot_table(index=['Country', 'Date'], columns='Team', values='Rating').reset_index()\
.sort_values(['Country', 'Date'], ascending=False).fillna(method='bfill', axis=0)
它将创建一个
pivot\u表
,按您拥有的不规则顺序对值进行排序,并在缺少的地方提取最后一个现有值。“我希望在未更新时使用它们以前的值,而不是空值。”前一行的时间顺序还是前一行的时间顺序?前一行应该有它们之前的时间顺序。我也认为这是一种不规则的排序,但后来我意识到这只是一种非常令人困惑的美式英语写日期的方式(同样,在OP的情况下是降序)。编辑:好的,当然你也注意到了,因为你的答案中有sort\u值
部分,但无论如何我都不得不反对这种写日期的方式:P@UJIN旧日期出现在顶部的原因是它们首先保存在数据库中(如果只是因为它们最先发生的原因)。因此,无论您住在哪里,我都不希望提取的日期数据的顺序与预期不同。谢谢@UJN,有什么方法可以将国家列保留在df中?@nimgwfc检查编辑。我不能向您保证它将始终适用于重复的日期和不同的国家。也许使用实际的数据集会更容易找到解决方案,或者至少使用一个包含一些边缘案例的示例。
data.pivot_table(index=['Country', 'Date'], columns='Team', values='Rating').reset_index()\
.sort_values(['Country', 'Date'], ascending=False).fillna(method='bfill', axis=0)