2017-09-23 19 views
0

我需要基于分割基于空格的score列(包含匹配结果)在两行中扩展我的熊猫数据框的单个行。熊猫数据框:将列扩展为行加上增量编号

这就是数据的模样

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 

我想在下面的代码行的适应需要做的地方,但我不能” W图出来,但是,它应该是如何工作的:

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

回答

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 
+0

我刚刚解决了这个问题。有什么区别吗? 'df ['setnumber'] = df.groupby(['A','B'])。cumcount()+ 1' – beta

+0

不多,'assign'返回一个副本,你的方法将它设置为'df'。 – Zero

+0

太好了,谢谢。将尽可能接受。 – beta

相关问题