Python 我们可以在数据帧上的运算符链接中添加用户定义的函数吗?
我定义了一个函数:Python 我们可以在数据帧上的运算符链接中添加用户定义的函数吗?,python,pandas,Python,Pandas,我定义了一个函数: def keep_alphabets(name): energy[name] = energy[name].map(lambda x : ' '.join([re.sub('[^A-Za-z]','',w) for w in x.split()])) 我有一个使用操作符链接的现有数据帧 energy = (pd.read_excel('Energy Indicators.xls',skiprows=17, skip_footer=0,na_valu
def keep_alphabets(name):
energy[name] = energy[name].map(lambda x : ' '.join([re.sub('[^A-Za-z]','',w) for w in x.split()]))
我有一个使用操作符链接的现有数据帧
energy = (pd.read_excel('Energy Indicators.xls',skiprows=17, skip_footer=0,na_values='...')
.drop(['Unnamed: 0','Unnamed: 1'], axis=1)
.rename(columns = {'Unnamed: 2' : 'Country','Petajoules' : 'Energy Supply','Gigajoules' : 'Energy Supply per Capita',
'%' : '% Renewable'})
.replace({'Country':{"Republic of Korea": "South Korea",
"United States of America": "United States",
"United Kingdom of Great Britain and Northern Ireland": "United Kingdom",
"China, Hong Kong Special Administrative Region3": "Hong Kong"}})
.head(227))
我可以在这里添加keep_alphabets函数吗?IIUC的最后一步应该是
应用
,如果需要,对df的每一列使用lambda函数:
.apply(lambda x : ' '.join([re.sub('[^A-Za-z]','',w) for w in x.split()]), axis=1)
你可以做以下事情
# for single elements
def keep_alphabets_elem(s):
return ' '.join([re.sub('[^A-Za-z]','',w) for w in s.split()]))
energy = (pd.read_excel('Energy Indicators.xls',skiprows=17, skip_footer=0,na_values='...')
.drop(['Unnamed: 0','Unnamed: 1'], axis=1)
.rename(columns = {'Unnamed: 2' : 'Country','Petajoules' : 'Energy Supply','Gigajoules' : 'Energy Supply per Capita',
'%' : '% Renewable'})
.replace({'Country':{"Republic of Korea": "South Korea",
"United States of America": "United States",
"United Kingdom of Great Britain and Northern Ireland": "United Kingdom",
"China, Hong Kong Special Administrative Region3": "Hong Kong"}})
.apply(lambda x: keep_alphabets_elem(x['COL_NAME'], axis=1) # NEW
.head(227))
请注意,需要使用axis=1对行而不是列执行此操作 如果您只想修改一个名为'col'
的列:
.assign(col=energy['col'].map(func))
.assign(**{name: energy[name].map(func)})
其中func
是您定义的lambda函数:
def func(x):
return ' '.join([re.sub('[^A-Za-z]','',w) for w in x.split()])
如果要将列名放入变量name='col'
:
.assign(col=energy['col'].map(func))
.assign(**{name: energy[name].map(func)})
您可以使用df.apply(func_name)
…使用df.apply
并传递lambda
。name
参数是什么?参数将是数据库中的一列,格式为系列@i是要以这种方式修改的单个列,还是所有列?