2016-07-15 3 views
1

これは私のデータフレームです(より多くの文字と長さ〜35.5k)。すべての変数は文字列で、['C1'、 'C​​2']はマルチインデックスです。2列(Python、Pandas)のテキストに従って行を分割します。

tmp 

C1 C2  C3 C4 C5 Start End  C8 
A  1  -  -  - 12  14  - 
A  2  -  -  - 1,4,7 3,6,10 - 
A  3  -  -  - 16,19 17,21 - 
A  4  -  -  - 22  24  - 

は、私はそれが(他のすべてを維持カンマが含まれているすべての行分割)本になる必要があります:私は

s = tmp['Start'].str.split(',').apply(Series, 1).stack() 
s.index = s.index.droplevel(-1) 
s.name = 'Start 
del tmp['Start'] 
final = tmp.join(s) 

としてこのスクリプト pandas: How do I split text in a column into multiple rows?

を試してみました

C1 C2  C3 C4 C5 Start End C8 Appearance 
A  1  -  -  - 12  14 - 1 
A  2  -  -  - 1  3  - 1 
A  2  -  -  - 4  6  - 2 
A  2  -  -  - 7  10 - 3 
A  3  -  -  - 16  17 - 1 
A  3  -  -  - 19  21 - 2 
A  4  -  -  - 22  24 - 1 

しかし、結果はそれよりもはるかに大きいです!何千ものリピートがあり、これは単に「開始」を分割しようとしているだけです。私も「スタート」内のすべてのコンマが「終了」にカンマを意味します(開始と終了の両方のためにそうしようと想像することはできません。

Lengths: 
tmp = 35568 
s  = 35676 
final = 293408 
+0

これは期待されていませんか? [1、4、7]が連続している場合は、結果に2つの行が追加されます。 – ayhan

答えて

3

あなたがs1s2から新しいdfを作成し、joinことができます。また、より良いが、使用パラメータexpand=Truestr.splitにあり、dropで複数の列を削除します。cumcountindexすることにより、カラムAppearance使用groupbyを作成するための

コメントによる10
s1 = tmp['Start'].str.split(',', expand=True).stack() 
s1.index = s1.index.droplevel(-1) 
s1.name = 'Start' 

s2 = tmp['End'].str.split(',', expand=True).stack() 
s2.index = s2.index.droplevel(-1) 
s2.name = 'End' 
tmp.drop(['Start', 'End'], inplace=True, axis=1) 

df = pd.DataFrame({'s1':s1, 's2':s2}, index=s1.index) 
final = tmp.join(df) 

final['Appearance'] = final.groupby(final.index).cumcount() + 1 
print (final) 
    C1 C2 C3 C4 C5 C8 s1 s2 Appearance 
0 A 1 - - - - 12 14   1 
1 A 2 - - - - 1 3   1 
1 A 2 - - - - 4 6   2 
1 A 2 - - - - 7 10   3 
2 A 3 - - - - 16 17   1 
2 A 3 - - - - 19 21   2 
3 A 4 - - - - 22 24   1 

EDIT:

あなたが試すことができreset_index最初:私は、彼らは、同じ数を持っていない場合でも、一致を確実にする'Start''End'列を拡大しCONCAT

print (tmp) 
     C3 C4 C5 Start  End C8 
C1 C2       
A 1 - - -  12  14 - 
    2 - - - 1,4,7 3,6,10 - 
    3 - - - 16,19 17,21 - 
    4 - - -  22  24 - 

tmp.reset_index(inplace=True) 
print (tmp) 
    C1 C2 C3 C4 C5 Start  End C8 
0 A 1 - - -  12  14 - 
1 A 2 - - - 1,4,7 3,6,10 - 
2 A 3 - - - 16,19 17,21 - 
3 A 4 - - -  22  24 - 
+0

"[293408行×7列]" s1/s2と同じ量の行を持つべきではありませんか? (〜35k) – Nico

+0

長さ 's1'と' s2'は同じですか? 's2'のインデックスと同じ' s1'のインデックスですか? – jezrael

+0

はい! StartのカンマはすべてEndのコンマを意味します。 – Nico

2

エントリ。

s = tmp.Start.str.split(',', expand=True).stack().rename('Start') 
e = tmp.End.str.split(',', expand=True).stack().rename('End') 
se = pd.concat([s, e], axis=1).reset_index(1, drop=True) 

tmp.drop(['Start', 'End'], axis=1).merge(se, left_index=True, right_index=True) 

enter image description here

+0

'TypeError:split()は予期しないキーワード引数 'expand''を持っています – Nico

+0

@Nico引数を削除します。古いpandasバージョンを使用しています。 – piRSquared

+0

あなたの答えはいいです;)+1 – jezrael

関連する問題