2017-09-23 13 views
0

score列(一致結果を含む)をスペースに基づいて分割することに基づいて、私のパンダのデータフレームの1行を複数の行に展開する必要があります。パンダのデータフレーム:列を行に追加して増分番号を付ける

これは、データが、私はhereからのアプローチを使用し目標を達成するために

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

のように見えるものです。

少しアプローチを適応して、私のデータフレームは、次のようになります。

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 

しかし、私はまた、試合ごとのセットの数を表し、別の追加の列を持っていると思います。それはマッチごとのセットの累積カウントのようなものです。どこかで、次のコード行での適応が行われる必要があるが、私は「couldn私は思います

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 

答えて

3

あなたはまた、を得ることができ、その後repeatcumcount

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 

を使用することができますと.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 ']).countcount()+ 1' – beta

+0

' assign'はコピーを返しますが、あなたのメソッドはそれを 'df'に設定します。 – Zero

+0

すばらしい、ありがとう。可能であれば受け入れます。 – beta

関連する問題