Создать столбцы pandas кадра данных из других столбцов, содержащих данные в текстовом формате - PullRequest
1 голос
/ 22 марта 2020

У меня есть следующий фрейм данных

data= {
    'a_index':[55, 72, 112, 55, 53, 100, 89],
    'make':['TY', 'FD', 'TA', 'HA', 'MA', 'BW', 'VN'],
    'p_index':[120, 70, 120, 128, 180, 172, 150],
    'score':['2.3,1.3,3.2,3.4','2.7,4.3, 4.2,3.4','2.3,4.3, 4.2,,3.4', '2.3,4.3, 4.2,3.4', '1.3,5.3, 7.2,3.4', '2.3,4.3, 4.2,3.4', '2.3,4.3,4.2,3.4'],
}
df = pd.DataFrame(data,
                  index=['NK', 'JN', 'NA', 'PP', 'DK', 'HA', 'CK'])
df

, который дает мне

    a_index make  p_index   score
NK  55      TY     120      2.3,1.3,3,2,3.4
JN  72      FD     70       2.7,4.3, 4,2,3.4
NA  112     TA     120      2.3,4.3, 4,2,,3.4
PP  55      HA     128      2.3,4.3, 4,2,3.4
DK  53      MA     180      1.3,5.3, 7,2,3.4
HA  100     BW     172      2.3,4.3, 4,2,3.4
CK  89      VN     150      2.3,4.3,4,2,3.4

Какой самый простой путь к следующему фрейму данных из этого фрейма данных

    a_index make    p_index score             sore_1    sore_2  sore_3  sore_4
NK   55     TY      120      2.3,1.3,3,2,3.4    2.3     1.3     3.2      3.4
JN   72     FD      70       2.7,4.3, 4,2,3.4   2.7     4.3     4.2      3.4
NA   112    TA      120      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
PP   55     HA      128      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
DK   53     MA      180      1.3,5.3, 7,2,3.4   1.3     5.3     7.2      3.4
HA   100    BW      172      2.3,4.3, 4.2,3.4   2.3     4.3     4.2      3.4
CK   89     VN      150      2.3,4.3,4.2,3.4    2.3     4.3     4.2      3.4

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Попробуйте:

exploded = df.score.apply(lambda x: pd.Series(x.split(',')))       # use explode

exploded.columns = ['score_'+str(col) for col in exploded.columns] # rename columns

pd.concat([df, exploded], axis=1)                                  # concat to original df
print(df)

    a_index make  p_index             score score_0 score_1 score_2 score_3 score_4
NK       55   TY      120   2.3,1.3,3,2,3.4     2.3     1.3       3       2     3.4
JN       72   FD       70  2.7,4.3, 4,2,3.4     2.7     4.3       4       2     3.4
NA      112   TA      120  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
PP       55   HA      128  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
DK       53   MA      180  1.3,5.3, 7,2,3.4     1.3     5.3       7       2     3.4
HA      100   BW      172  2.3,4.3, 4,2,3.4     2.3     4.3       4       2     3.4
CK       89   VN      150   2.3,4.3,4,2,3.4     2.3     4.3       4       2     3.4
3 голосов
/ 22 марта 2020

вы можете использовать:

pd.concat(
    [
        df, 
        df['score'].str.split(',', expand=True).rename(
            lambda x: f'score_{x}',axis='columns')
    ], axis=1)

enter image description here

3 голосов
/ 22 марта 2020

Вы можете попробовать использовать это.

df['score'].str.split(',').apply(pd.Series).rename(columns = {0:'score_1',1:'score_2',2:'score_3',3:'score_4'})

    score_1 score_2 score_3 score_4
NK  2.3 1.3 3.2 3.4
JN  2.7 4.3 4.2 3.4
NA  2.3 4.3 4.2 3.4
PP  2.3 4.3 4.2 3.4
DK  1.3 5.3 7.2 3.4
HA  2.3 4.3 4.2 3.4
CK  2.3 4.3 4.2 3.4

и затем объединить его с исходным кадром данных.

...