Как применить / лямбда с функцией Apply в Pandas? - PullRequest
1 голос
/ 13 марта 2019

Я новичок в Пандах, и я пробовал следующее:

У меня есть два набора данных:

df5 = pd.DataFrame({"id":[1,2,3,4,5]})
df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})

Я хотел бы заменить идентификаторы в df5 фактическими именами из df6, используя apply или lambda apply. Я пробовал следующее:

def extract_name2 (x):
    name = df6[df6["ID"] == x]["Name"]
    return name
df5["id"].apply(extract_name2)

Это мой вывод:

Out[120]: 
0     1      2     3    4
0  Tom   NaN    NaN   NaN  NaN
1  NaN  Dick    NaN   NaN  NaN
2  NaN   NaN  Harry   NaN  NaN
3  NaN   NaN    NaN  Mike  NaN
4  NaN   NaN    NaN   NaN  Sam

Я тоже пробовал:

df5["id"].apply(lambda x: df6[df6["ID"] == x]["Name"])

Но тот же результат

Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Вам необходимо использовать iloc:

df5 = pd.DataFrame({"id":[1,2,3,4,5]})
df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})

def extract_name2 (x):
    name = df6[df6["ID"] == x]["Name"].iloc[0]
    return name
print(df5["id"].apply(extract_name2))

Вывод:

0      Tom
1     Dick
2    Harry
3     Mike
4      Sam
0 голосов
/ 13 марта 2019

Не используйте apply.Это удобная функция, которая по существу оборачивает цикл уровня Python.Это последнее средство.Вместо этого вам нужно использовать индексирование панд так, как оно предназначено для использования .В этом случае ID является вашим индексом:

In [1]: import pandas as pd

In [2]: df5 = pd.DataFrame({"id":[1,2,3,4,5]})
   ...: df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})
   ...: df6.set_index("ID", inplace=True)
   ...:
   ...:

In [3]: df6.Name[df5.id]
Out[3]:
ID
1      Tom
2     Dick
3    Harry
4     Mike
5      Sam
Name: Name, dtype: object

Примечание,

In [5]: df7  = pd.DataFrame({"id":[2,2,1,3,1]})

In [6]: df6.Name[df7.id]
Out[6]:
ID
2     Dick
2     Dick
1      Tom
3    Harry
1      Tom
Name: Name, dtype: object
0 голосов
/ 13 марта 2019

Когда вы говорите df6[df6["ID"] == x], вывод представляет собой кадр данных, отфильтрованный на основе заданного вами условия.

Необходимо указать, что вам нужно первое значение ячейки из столбца 'Name' отфильтрованного кадра данных.

Это даст вам желаемый результат:

df5['id'].apply(lambda x: df6[df6['ID'] == x]['Name'].iloc[0])

ОБНОВЛЕНИЕ:

Вы также можете сделать это без использования apply.Используйте merge:

pd.merge(df5, df6, how='left', left_on='id', right_on='ID')

ВЫХОД:

id  ID  Name
1   1   Tom
2   2   Dick
3   3   Harry
4   4   Mike
5   5   Sam
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...