2017-02-23 7 views
2

いくつかの列には複数の値があり、常に,で区切られたデータフレームがあります。パンダ:セパレータのn個の新しい列にコラムを分割する

df = pd.DataFrame([['', 'mariachi', 'mexico, united states'], 
        ['', 'jazz, rap', 'united states'], 
        ['', '', 'spain'], 
        ['jimi hendrix, john lennon', 'rock', ''], 
        ['spirit', '', 'united states'], 
        ['', 'latin', 'united states'], 
        ['', '', ''], 
        ['speak', '', 'mexico, united states']], 
        columns=['Musician', 'Genre', 'Country']) 


         Musician   Genre     Country 
    1       NaN  mariachi  mexico, united states 
    2       NaN  jazz, rap    united states 
    3       NaN   NaN      spain 
    4 jimi hendrix, john lennon   rock      NaN 
    5      spirit   NaN    united states 
    6       NaN   latin    united states 
    7       NaN   NaN      NaN 
    8      speak   NaN  mexico, united states 

どのように私は、それぞれが1つの変数のみを含むとn列に列を分割することができますか?

例:

  Musician  Musician2   Genre  Genre2   Country   Country2 
    1   NaN    NaN  mariachi   NaN   mexico united states 
    2   NaN    NaN   jazz   rap united states    NaN 
    3   NaN    NaN   NaN   NaN   spain    NaN 
    4 jimi hendrix  john lennon   rock   NaN    NaN    NaN 
    5  spirit    NaN   NaN   NaN united states    NaN 
    6   NaN    NaN   latin   NaN united states    NaN 
    7   NaN    NaN   NaN   NaN    NaN    NaN 
    8   speak    NaN   NaN   NaN   mexico united states 

答えて

1

私はあなたがNaNmapjoinと最後replaceすべての空stringsNoneで列のMultiindexを削除し、その後、str.splitconcatlist comprehensionを使用することができると思う:

cols = ['Musician','Genre','Country'] 
df = pd.concat([df[x].str.split(',', expand=True) for x in cols], axis=1, keys=df.columns) 
df.columns = df.columns.map(lambda x: '_'.join((x[0], str(x[1])))) 
df = df.replace({'':np.nan, None:np.nan}) 
print (df) 
    Musician_0 Musician_1 Genre_0 Genre_1  Country_0  Country_1 
0   NaN   NaN mariachi  NaN   mexico united states 
1   NaN   NaN  jazz  rap united states    NaN 
2   NaN   NaN  NaN  NaN   spain    NaN 
3 jimi hendrix john lennon  rock  NaN   NaN    NaN 
4  spirit   NaN  NaN  NaN united states    NaN 
5   NaN   NaN  latin  NaN united states    NaN 
6   NaN   NaN  NaN  NaN   NaN    NaN 
7   speak   NaN  NaN  NaN   mexico united states 

DataFramesが別の列である場合:

df = pd.DataFrame([['', 'mariachi', 'mexico, united states',5], 
        ['', 'jazz, rap', 'united states',8], 
        ['', '', 'spain',8], 
        ['jimi hendrix, john lennon', 'rock', '',1], 
        ['spirit', '', 'united states',7], 
        ['', 'latin', 'united states',1], 
        ['', '', '',0], 
        ['speak', '', 'mexico, united states',3]], 
        columns=['Musician', 'Genre', 'Country', 'Val']) 
print (df) 
        Musician  Genre    Country Val 
0        mariachi mexico, united states 5 
1        jazz, rap   united states 8 
2              spain 8 
3 jimi hendrix, john lennon  rock       1 
4      spirit      united states 7 
5         latin   united states 1 
6                 0 
7      speak    mexico, united states 3 

最後ことができます分割されていないconcat列:

cols = ['Musician','Genre','Country'] 
df1 = pd.concat([df[x].str.split(',', expand=True) for x in cols], axis=1, keys=df.columns) 
df1.columns = df1.columns.map(lambda x: '_'.join((x[0], str(x[1])))) 
df1 = df1.replace({'':np.nan, None:np.nan}) 
print (df1) 
    Musician_0 Musician_1 Genre_0 Genre_1  Country_0  Country_1 
0   NaN   NaN mariachi  NaN   mexico united states 
1   NaN   NaN  jazz  rap united states    NaN 
2   NaN   NaN  NaN  NaN   spain    NaN 
3 jimi hendrix john lennon  rock  NaN   NaN    NaN 
4  spirit   NaN  NaN  NaN united states    NaN 
5   NaN   NaN  latin  NaN united states    NaN 
6   NaN   NaN  NaN  NaN   NaN    NaN 
7   speak   NaN  NaN  NaN   mexico united states 

df2 = pd.concat([df1, df.drop(cols, axis=1)],axis=1) 
print (df2) 
    Musician_0 Musician_1 Genre_0 Genre_1  Country_0 \ 
0   NaN   NaN mariachi  NaN   mexico 
1   NaN   NaN  jazz  rap united states 
2   NaN   NaN  NaN  NaN   spain 
3 jimi hendrix john lennon  rock  NaN   NaN 
4  spirit   NaN  NaN  NaN united states 
5   NaN   NaN  latin  NaN united states 
6   NaN   NaN  NaN  NaN   NaN 
7   speak   NaN  NaN  NaN   mexico 

     Country_1 Val 
0 united states 5 
1    NaN 8 
2    NaN 8 
3    NaN 1 
4    NaN 7 
5    NaN 1 
6    NaN 0 
7 united states 3 
+0

ありがとう!このコードは正常に動作します。私は、しかし、分離されることを意図していない他の列があることを忘れてしまった。この場合、どのように処理する列を指定しますか? – kbecker87

+1

編集した回答を確認してください。 – jezrael

+0

Columnsへの制限は私にとってはこのようには機能しません。分割する必要があるものだけを指定すると、他のすべての列が乱れることがあります。テスト目的のためにもう1つの列で同じdfを使用すると機能しません。 – kbecker87

関連する問題