Предотвратить исчезновение имени столбца после использования замены в кадре данных - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть реальный фрейм данных, который несколько повторяет следующую структуру:

d = {'col1':['1_ABC','2_DEF','3 GHI']}
df = pd.DataFrame(data=d)

В основном, некоторые записи имеют "_" , другие имеют "" .Моя цель - разбить этот первый номер на новый столбец и оставить остальные.Для этого я решил сначала заменить '_' на '' , чтобы все нормализовать, а затем просто разделить на '' , чтобы получить новыйcolumn.

#Replace the '_' for ' '
new_df['Name'] = df['Name'].str.replace('_',' ')

Моя проблема в том, что теперь мой new_df теперь потерял имя столбца:

0    1 ABC
1    2 DEF

Есть ли способ предотвратить это?

Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2019

Функция str.replace возврат Series, поэтому имя столбца отсутствует, только Series имя.

s = df['col1'].str.replace('_',' ')
print (s)
0    1 ABC
1    2 DEF
2    3 GHI
Name: col1, dtype: object

print (type(s))
<class 'pandas.core.series.Series'>

print (s.name)
col1

Если необходимо, чтобы новый столбец назначался так жеDataFrame - df['Name']:

df['Name'] = df['col1'].str.replace('_',' ')
print (df)
    col1   Name
0  1_ABC  1 ABC
1  2_DEF  2 DEF
2  3 GHI  3 GHI

Или перезаписать значения исходного столбца:

df['col1'] = df['col1'].str.replace('_',' ')
print (df)
    col1
0  1 ABC
1  2 DEF
2  3 GHI

При необходимости новый один столбец DataFrame использовать Series.to_frame для преобразования Series в df:

df2 = df['col1'].str.replace('_',' ').to_frame()
print (df2)
    col1
0  1 ABC
1  2 DEF
2  3 GHI

Также возможно определить новое имя столбца:

df1 = df['col1'].str.replace('_',' ').to_frame('New')
print (df1)
     New
0  1 ABC
1  2 DEF
2  3 GHI

Как @ anky_91 прокомментировал, если нужноновые 2 столбца добавить str.split:

df1 = df['col1'].str.replace('_',' ').str.split(expand=True)
df1.columns = ['A','B']
print (df1)
   A    B
0  1  ABC
1  2  DEF
2  3  GHI

При необходимости добавить столбцы к существующим DataFrame:

df[['A','B']] = df['col1'].str.replace('_',' ').str.split(expand=True)
print (df)
    col1  A    B
0  1_ABC  1  ABC
1  2_DEF  2  DEF
2  3 GHI  3  GHI
...