我有一个充满科学论文信息的数据框。
我的数据框:
database authors title
0 sciencedirect [{'surname': 'Sharafaldin', 'first_name': 'Iman'}, An eval...
{'surname': 'Lashkari', 'first_name': 'Arash Habibi'}]
1 sciencedirect [{'surname': 'Srinivas', 'first_name': 'Jangirala'}, Governmen...
{'surname': 'Das', 'first_name': 'Ashok Kumar'}]
2 sciencedirect [{'surname': 'Bongiovanni', 'first_name': 'Ivano'}] The last...
3 ieeexplore [Igor Kotenko, Andrey Chechulin] Cyber Attac...
如您所见,“作者”列包含一个词典列表,但仅,其中数据库为sciencedirect
。为了进行一些分析,我需要清除数据。因此,我的目标是将名称仅放入第4行中的列表中。
我想要的东西:
# From:
[{'surname': 'Sharafaldin', 'first_name': 'Iman'}, {'surname': 'Lashkari', 'first_name': 'Arash Habibi'}]
# To:
[Iman Sharafaldin, Arash Habibi Lashkari]
我的方法是创建两个遮罩,一个遮罩用于数据库列,仅提取sciencedirect
篇论文,另一个遮罩遮盖整个authors
列。从这些掩码中,创建一个新的数据框,在该列上,我运行以下所示的代码“ authors”。它提取每个单元格的作者姓名,并将它们存储在列表中,就像我想要的那样:
scidir_mask = df["database"] == 'sciencedirect'
authors_col = df["authors"] is not None
only_scidir = df[authors_col & scidir_mask]
for cell in only_scidir["authors"]:
# get each list from cell
cell_list = []
for dictionary in cell:
# get the values from dict and reverse into list
name_as_list = [*dictionary.values()][::-1]
# make list from first and surname a string
author = ' '.join(name_as_list)
cell_list.append(author)
因此,在以上代码的结尾,cell_list
包含了我想要的作者姓名。
但是,我不知道如何将这些cell_lists
存储回原始数据框中。
那么,如何获取数据库为sciencedirect
的authors单元,执行我的小函数并将函数的输出存储回该单元格中?
答案 0 :(得分:1)
想法是使用f-string
s创建自定义函数,并且仅适用于已过滤的行:
scidir_mask = df["database"] == 'sciencedirect'
f = lambda x: [f"{y['first_name']} {y['surname']}" for y in x]
df.loc[scidir_mask, 'authors'] = df.loc[scidir_mask, 'authors'].apply(f)
print (df)
database authors title
0 sciencedirect [Iman Sharafaldin, Arash Habibi Lashkari] An eval
1 sciencedirect [Jangirala Srinivas, Ashok Kumar Das] Governmen
2 sciencedirect [Ivano Bongiovanni] The last
3 ieeexplore [Igor Kotenko, Andrey Chechulin] Cyber Attac