通过将现有的pandas列值作为参数传递给API调用,在数据帧中创建新列



我在下面创建了一个函数get_lyrics,我想从现有数据帧中传递Song_Title和Singer_Name列值,并在数据帧中创建一个新列。

我下面试图创建列df['Lyrics']的代码在下面给了我这个错误,我不知道为什么:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我用get_lyrics(test_song_name, test_song_author)对函数进行了测试,它返回了一个很长的字符串。

import lyricsgenius as lg 
import pandas as pd     
genius = lg.Genius(access_token=token)
test_song_name = "My Heart Will Go On"
test_song_author = "Celine Dion"

def get_lyrics(Song_Title, Singer_Name):
song = genius.search_song(Song_Title, Singer_Name)
return song.lyrics

get_lyrics(test_song_name, test_song_author)
df['Lyrics'] = df.apply(
get_lyrics(
df["Song_Title"], df["Singer_Name"]
) 
)

要在行上应用函数,可以将apply()axis=1一起使用。

df['Lyrics'] = df.apply(lambda row: get_lyrics(row["Song_Title"], row["Singer_Name"]), axis=1)

或者在单行中具有lambda函数

df['Lyrics'] = df.apply(lambda row: genius.search_song(row["Song_Title"], row["Singer_Name"]).lyrics, axis=1)

如果你不想要lambda,你可以做

def get_lyrics(row):
song = genius.search_song(row["Song_Title"], row["Singer_Name"])
return song.lyrics
df['Lyrics'] = df.apply(genius.search_song, axis=1)

我在这里找到了这个页面:https://www.codeforests.com/2020/07/18/pass-multiple-columns-to-lambda/

这有两个可行的解决方案。第一个与@Ynjxsjmh 发布的内容相同

df["Lyrics"] = df.apply(lambda x : 
get_lyrics(x["Song_Title"], x["Singer_Name"]), axis=1
)

后一个首先选择数据帧列的一个子集,然后用*x将它们解包,以提供给get_lyrics。

df["Lyrics"] = df[["Song_Title", "Singer_Name"]].apply(lambda x: 
get_lyrics(*x),
axis=1)

最新更新