Запустить функцию для ячейки в столбце на основе другого столбца - PullRequest
1 голос
/ 02 октября 2019

У меня есть фрейм данных, полный научной научной статьи.

Мой фрейм данных :

        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. Из этой маски создается новый фрейм данных, в столбце «авторы» которого я запускаю код, показанный ниже. Он извлекает имена авторов каждой ячейки и сохраняет их в списке, так, как я хочу:

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выполнить мою маленькую функцию и сохранить результат моей функции обратно в ячейку?

1 Ответ

1 голос
/ 02 октября 2019

Идея заключается в создании пользовательской функции с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...