Python 基于另一列对列中的单元格运行函数

Python 基于另一列对列中的单元格运行函数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个充满科学论文信息的数据框架 我的数据帧: database authors title 0 sciencedirect [{'surname': 'Sharafaldin', 'first_name': 'Iman'}, An eval... {'surname': 'Lashkari', 'first_nam

我有一个充满科学论文信息的数据框架

我的数据帧

        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...

# From:
[{'surname': 'Sharafaldin', 'first_name': 'Iman'}, {'surname': 'Lashkari', 'first_name': 'Arash Habibi'}]

# To:
[Iman Sharafaldin, Arash Habibi Lashkari]
正如您所看到的,authors列包含一个字典列表,但只有数据库位于
sciencedirect
。为了进行一些分析,我需要清理数据。因此,我的目标是将这些名称放入列表中,如第4行所示

我想要什么

        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...

# From:
[{'surname': 'Sharafaldin', 'first_name': 'Iman'}, {'surname': 'Lashkari', 'first_name': 'Arash Habibi'}]

# To:
[Iman Sharafaldin, Arash Habibi Lashkari]
我的方法是创建两个掩码,一个用于数据库列,只提取
sciencedirect
论文,另一个掩码是整个
作者
列。从这些掩码中,创建了一个新的数据帧,我在其中的“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_列表
以我想要的方式包含作者姓名。 但我无法思考如何将这些
单元格列表
存储回原始数据帧



那么,如何获取数据库为
sciencedirect
的authors单元格,执行我的小函数并将函数的输出存储回单元格?

想法是使用
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

工作完美,谢谢你的快速回答。你能解释一下你的解决方案吗?就像这个f{}所做的,以及df.loc命令会发生什么