繁体   English   中英

类型错误:字符串索引必须是整数,使用 Pandas 与 lambda 一起应用

[英]TypeError: string indices must be integers using pandas apply with lambda

我有一个数据框,一列是 URL,另一列是名称。 我只是想添加第三列,该列采用 URL,并创建一个 HTML 链接。

newsSource具有链接名称,而url具有 URL。 对于数据框中的每一行,我想创建一个具有以下内容的列:

<a href="[the url]">[newsSource name]</a>

尝试以下会引发错误

文件“C:\\Users\\AwesomeMan\\Documents\\Python\\MISC\\News Alerts\\simple_news.py”,第 254 行,在 df['sourceURL'] = df['url'].apply(lambda x: '{1} '.format(x, x[0]['newsSource']))
类型错误:字符串索引必须是整数

df['sourceURL'] = df['url'].apply(lambda x: '<a href="{0}">{1}</a>'.format(x, x['source']))

但是我以前用过x[colName]吗? 下面的行工作正常,它只是创建一个源名称的列:

df['newsSource'] = df['source'].apply(lambda x: x['name'])

为什么突然(对我来说“突然”)说我无法访问索引?

pd.Series.apply只能访问单个系列,即您调用方法的系列。 换句话说,您提供的函数,无论它是命名的还是匿名的lambda ,都只能访问df['source']

要按行访问多个系列,您需要沿axis=1 pd.DataFrame.apply

def return_link(x):
    return '<a href="{0}">{1}</a>'.format(x['url'], x['source'])

df['sourceURL'] = df.apply(return_link, axis=1)

请注意,以这种方式传递整个系列会产生开销; pd.DataFrame.apply只是一个隐蔽的、低效的循环。

您可能会发现列表理解更有效:

df['sourceURL'] = ['<a href="{0}">{1}</a>'.format(i, j) \
                   for i, j in zip(df['url'], df['source'])]

这是一个工作演示:

df = pd.DataFrame([['BBC', 'http://www.bbc.o.uk']],
                  columns=['source', 'url'])

def return_link(x):
    return '<a href="{0}">{1}</a>'.format(x['url'], x['source'])

df['sourceURL'] = df.apply(return_link, axis=1)

print(df)

  source                  url                              sourceURL
0    BBC  http://www.bbc.o.uk  <a href="http://www.bbc.o.uk">BBC</a>

带有 zip 和字符串的老式字符串格式

df['sourceURL'] = ['<a href="%s.">%s.</a>' % (x,y) for x , y in zip (df['url'], df['source'])]

这是f-string

[f'<a href="{x}">{y}</a>' for x , y in zip ((df['url'], df['source'])]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM