如何转换数据框列

时间:2019-11-11 13:18:24

标签: 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 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

我希望它看起来像这样,但是我正在努力弄清楚(我对数据帧还是陌生的)怎么做:

Country         Date    Team A  Team B  Team C
United Kingdom  11/8/2019   95  90  90
United Kingdom  2/20/2019   90  90  90
United Kingdom  9/22/2017   90  90  90
United Kingdom  6/28/2016   95  90  90
United Kingdom  6/27/2016   95  95  90
United Kingdom  6/24/2016   95  95  100
United Kingdom  6/12/2015   95  95  100
United Kingdom  6/13/2014   95  95  100
United Kingdom  4/19/2013   95  95  100
United Kingdom  2/22/2013   95  100 100
United Kingdom  12/13/2012  100 100 100
United Kingdom  3/14/2012   100 100 100
United Kingdom  2/13/2012   100 100 100
United Kingdom  10/26/2010  100 100 100
United Kingdom  5/21/2009   100 100 100
United Kingdom  9/21/2000   100 100 100
United Kingdom  9/21/2000   100 100 100
United Kingdom  8/10/1994   100 100 100
United Kingdom  6/26/1989   100 100 100
United Kingdom  4/28/1978   100 100 100
United Kingdom  3/31/1978   100 100 100

因此,从本质上讲,我希望国家和日期列保持不变,但是相对于每行只有一个团队,我希望所有团队都显示为列。我希望不要使用空白值,而要使用未更新的值。

例如,对于11/8/2019,您可以在我的原始df中看到只有A队的等级发生变化。对于“团队B”和“团队C”列,我希望他们使用以前的值(如果未更新)。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:1)

首先,如果您需要对日期时间进行排序,我建议您使用日期的private static final Logger log = LoggerFactory.getLogger("checks"); 字符串表示形式(例如,第一条记录使用YYYYMMDD)或使用实际的{{1 }}数据类型。使用美式表示法会造成混淆,并且很难进行排序。

无论如何,要解决您的问题,我建议您先使用熊猫pivot函数,然后使用 fill NaN (即fillna)函数和回填(即20191108)方法。

编辑:如果您想保留datetime列,似乎将它与bfill列一起用作多索引将无法与Country一起使用。您可以做的是保留原始的Date并将其与新的pivot列一起加入。

df

答案 1 :(得分:1)

基本上,您需要的是:

data.pivot_table(index=['Country', 'Date'], columns='Team', values='Rating').reset_index()\
    .sort_values(['Country', 'Date'], ascending=False).fillna(method='bfill', axis=0)

它将创建一个pivot_table,以不规则的顺序对值进行排序,并在缺少的地方提取最后存在的值。