首页 > 解决方案 > 在数据框上使用替换后防止列名消失

问题描述

所以我有一个真实的数据框,它有点遵循下一个结构:

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

基本上,一些条目有“_”,其他有“”。我的目标是将第一个数字分成一个新列并保留其余部分。为此,我想我首先将'_'替换为' '以规范化所有内容,然后简单地用' '拆分以获得新列。

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

我的问题是,现在我的new_df现在丢失了它的列名:

0    1 ABC
1    2 DEF

有什么办法可以防止这种情况发生?

谢谢!

标签: python-3.xpandasstr-replace

解决方案


函数str.replacereturn 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转换Seriesdf

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

推荐阅读