熊猫和lambda-字符串索引必须为整数

时间:2018-07-27 19:06:15

标签: python pandas dataframe lambda series

我有一个数据框,一列是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']))
  TypeError:字符串索引必须为整数

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'])

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

2 个答案:

答案 0 :(得分:2)

pd.Series.apply仅可访问单个序列,即您要在其上调用方法的序列。换句话说,无论您提供的功能是命名的lambda还是匿名的df['source'],都只能访问axis=1

要逐行访问多个系列,您需要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

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>

这是一个工作示例:

var location = GetById(locationId);
if(location != null)
{
    location.Address = newAddress; <-- error highlights here
    await _context.SaveChangesAsync();
}

答案 1 :(得分:2)

使用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'])]