3 回答

TA贡献1921条经验 获得超9个赞
您遇到的问题与列和索引是pd.Index对象这一事实有关。pandas Index的fillna方法采用的参数与pandas Series或DataFrame的fillna方法采用的参数不同。我在下面做了一个玩具示例:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'a':[1], 'Unnamed:1':[1], 'Unnamed:2':[1], 'b':[1], 'Unnamed:3':[1]},
columns=['a', 'Unnamed:3', 'Unnamed:1', 'b', 'Unnamed:2']))
df
# a Unnamed:3 Unnamed:1 b Unnamed:2
#0 1 1 1 1 1
您原始的正则表达式无法捕获整个列名,我们来解决这个问题。
df.columns.str.replace('Unnamed:*', '')
#Index(['a', '3', '1', 'b', '2'], dtype='object')
df.columns.str.replace('Unnamed:\d+', '')
#Index(['a', '', '', 'b', ''], dtype='object')
df.columns.str.replace('Unnamed:.+', '')
#Index(['a', '', '', 'b', ''], dtype='object')
现在,让我们将索引转换为一系列,以便我们可以使用和的一个正则表达式的.replace和.fillna方法,pd.Series将相关的列名替换为ffill。最后,我们将其转换为pd.Index
pd.Index(
pd.Series(
df.columns
).replace('Unnamed:\d+', np.nan, regex=True).fillna(method='ffill')
)
#Index(['a', 'a', 'a', 'b', 'b'], dtype='object')
df.columns = pd.Index(pd.Series(df.columns).replace('Unnamed:\d+', np.nan, regex=True).fillna(method='ffill'))
df.head()
# a a a b b
#0 1 1 1 1 1
添加回答
举报