pandas dataframe хорошо обрабатывает элементы списка - PullRequest
0 голосов
/ 01 сентября 2018

Обновление: ответ @AntonvBR сработал. Большое спасибо!

Кроме того, поскольку здесь я имею дело с каждым элементом в столбце одного чая, так что это действительно Series, а не DataFrame. Таким образом, я думаю, .apply() работает так же, как .map().


Оригинальный вопрос:

Прошу прощения, что не знаю, как выразить мои слова лучше, но вот этот вопрос:

Скажем, есть два Фрейма Данных, СТУДЕНТ и УЧИТЕЛЬ.

Фрейм данных STUDENT состоит из двух столбцов: ID и home (из какого города она или он родом). Конечно, идентификаторы уникальны .

С другой стороны, фрейм данных TEACHER также имеет два столбца: ID и список идентификаторов студентов (в их классе).

Они похожи на это:

In [72]: stu
Out[72]:
ID home
0   1   XA
1   2   BJ
2   3   TJ
3   4   JN
4   5   CQ
5   6   SH
6   7   GZ
7   8   BJ
8   9   TJ
9  10   BJ

In [75]: tea
Out[75]:
ID            stu
0   1      [1, 2, 3]
1   2   [2, 7, 8, 9]
2   3  [4, 5, 6, 10]

А теперь я хочу добавить третью колонку на УЧИТЕЛЯ, которая также содержит список учителей «ученики» «дома» , и в каждом из них должно быть без дубликатов список.

Поэтому мне интересно, как я могу сделать это в стиле панды , который выглядит аккуратно и чисто?

Я новичок в pandas и SQL, и единственный способ, которым я придумаю, - это перебирать каждую строку, перебирать каждый список, извлекать значение из другого DataFrame и добавлять их один за другим ...

Пожалуйста, дайте мне несколько советов или подсказок.

Большое спасибо.

1 Ответ

0 голосов
/ 01 сентября 2018

Хорошо, это довольно тривиальная проблема, которая может быть решена разными способами. Тем не мение, тот факт, что внутри вашего столбца stu есть объекты, немного усложняет ситуацию.

Рассмотрим этот пример:

import pandas as pd

stu = pd.DataFrame({
    'ID': [1,2],
    'home': ['XA','BJ']
})

tea = pd.DataFrame({
    'ID': [1,2],
    'stu': [[1],[1,2]]
})

m = stu.set_index('ID')['home'] # <-- this here creates a map between stu id and stu home
tea['stu_home'] = tea['stu'].apply(lambda x: [m.get(i,'N/A') for i in x])

print(tea)

Возвращает:

   ID     stu  stu_home
0   1     [1]      [XA]
1   2  [1, 2]  [XA, BJ]

Краткое объяснение: .apply(), примененный к столбцу данных, будет принимать все элементы и выполнять функцию для каждого элемента (что в данном случае означает значения строки). При передаче лямбда-функции выражение становится действительно компактным. Мы хотим найти дом студента для каждого элемента внутри каждого элемента строки. Для этого мы можем использовать списки и получить значения из словаря (карты), который мы создали в строке выше. m.get(i, 'N/A') получит каждое значение и вернет N/A, если не найден. Это делает скрипт немного более «безопасным».

Надеюсь, это помогло вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...