Pandas数据帧:将列扩展为行以及增量编号

时间:2017-09-23 09:42:16

标签: python pandas dataframe series

我需要根据空格分割score列(包含匹配结果),在多行中展开我的Pandas数据帧的一行。

这就是数据的样子

A   B   score
1   2   6-1 6-2
3   4   6-4 4-6 6-3

为了达到目标,我使用了here的方法。

稍微调整一下这种方法,我的数据框看起来像这样:

A   B   score           sets
1   2   6-1 6-2         6-1
1   2   6-1 6-2         6-2
3   4   6-4 4-6 6-3     6-4
3   4   6-4 4-6 6-3     4-6
3   4   6-4 4-6 6-3     6-3

但是,我还希望有另一个附加列,表示每场比赛的集合数。它就像是每场比赛的累积计数。我的问题是,如何改变上述链接的解决方案,以获得所需的结果,如下所示:

A   B   score           sets    setnumber
1   2   6-1 6-2         6-1     1
1   2   6-1 6-2         6-2     2
3   4   6-4 4-6 6-3     6-4     1
3   4   6-4 4-6 6-3     4-6     2
3   4   6-4 4-6 6-3     6-3     3

我认为在以下代码行中的某个地方需要进行调整,但我无法弄清楚它应该如何工作:

s = df['score'].str.split(' ').apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1) # to line up with df's index

1 个答案:

答案 0 :(得分:3)

您可以使用repeat,然后使用cumcount

In [2915]: dff = df.set_index(['A', 'B'])['score'].repeat(
                            df['score'].str.split(' ').str.len()
                                 ).reset_index()

In [2916]: dff
Out[2916]:
   A  B        score
0  1  2      6-1 6-2
1  1  2      6-1 6-2
2  3  4  6-4 4-6 6-3
3  3  4  6-4 4-6 6-3
4  3  4  6-4 4-6 6-3

In [2917]: dff.assign(setnumber=dff.groupby(['A', 'B']).cumcount()+1)
Out[2917]:
   A  B        score  setnumber
0  1  2      6-1 6-2          1
1  1  2      6-1 6-2          2
2  3  4  6-4 4-6 6-3          1
3  3  4  6-4 4-6 6-3          2
4  3  4  6-4 4-6 6-3          3

您还可以使用dff

获取.loc
In [2923]: df.loc[df.index.repeat(df['score'].str.split(' ').str.len())]
Out[2923]:
   A  B        score
0  1  2      6-1 6-2
0  1  2      6-1 6-2
1  3  4  6-4 4-6 6-3
1  3  4  6-4 4-6 6-3
1  3  4  6-4 4-6 6-3