Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何转换数据帧列_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何转换数据帧列

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

我正在尝试转换从外部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 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)