我正在尝试将一个函数应用到Pandas dataframe的一列中,该函数返回一个元组列表。 这是我的函数:
def myfunc(text):
values=[]
sections=api_call(text)
for (part1, part2, part3) in sections:
value=(part1, part2, part3)
values.append(value)
return values
例如,
sections=myfunc("History: Had a fever\n Allergies: No")
print(sections)
输出:
[('past_medical_history', 'History:', 'History: Had a fever\n '), ('allergies', 'Allergies:', 'Allergies: No')]
对于每个元组,我想创建一个新的列。例如:
原始数据框如下所示:
id text
0 History: Had a fever\n Allergies: No
1 text2
在应用该函数之后,我希望数据框看起来像这样(其中 xxx 是各种文本内容):
id text part1 part2 part3
0 History: Had... past_... History: History: ...
0 Allergies: No allergies Allergies: Allergies: No
1 text2 xxx xxx xxx
1 text2 xxx xxx xxx
1 text2 xxx xxx xxx
...
我可以遍历数据框并生成一个新的数据框,但这样做会非常慢。我尝试了下面的代码,但是收到了一个 ValueError 的错误信息。有什么建议吗?
df.apply(lambda x: pd.Series(myfunc(x['col']), index=['part1', 'part2', 'part3']), axis=1)
我做了更多的研究,所以我的问题实际上归结为如何将一个包含元组列表的列展开。我在这个链接Split a list of tuples in a column of dataframe to columns of a dataframe找到了答案。以下是我所做的:
# step1: sectionizing
df["sections"] =df["text"].apply(myfunc)
# step2: unnest the sections
part1s = []
part2s = []
part3s = []
ids = []
def create_lists(row):
tuples = row['sections']
id = row['id']
for t in tuples:
part1s.append(t[0])
part2s.append(t[1])
part3s.append(t[2])
ids.append(id)
df.apply(create_lists, axis=1)
new_df = pd.DataFrame({"part1" :part1s, "part2": part2s, "part3": part3s,
"id": ids})[["part1", "part2", 'part3', "id"]]
但是性能并不太好。我想知道是否有更好的方法。
df[['part1', 'part2', 'part3']] = df['text'].apply(myfunc)
应该可以工作 - Asish M.df[['part1', 'part2', 'part3']] = df['names'].str.split(',',expand=True)
进行操作。 - Joe Ferndz