Панды - замена значений путем поиска в другом кадре данных - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть проблема, которую нужно решить в моем пандасе с использованием Python3.У меня есть два кадра данных - первый - как;

    ID Name  Linked Model 1  Linked Model 2  Linked Model 3
0  100    A          1111.0          1112.0             NaN
1  101    B          1112.0          1113.0          1115.0
2  102    C             NaN             NaN             NaN
3  103    D          1114.0             NaN             NaN
4  104    E          1114.0          1111.0          1112.0

, второй -

   Model ID Name
0      1111    A
1      1112  A,B
2      1113    C
3      1114    D
4      1115    Q
5      1116    Z
6      1117    E
7      1118    W

Поэтому код должен искать значение в - например, в Связать столбец модели 1 и найти соответствующее значение в столбце Имя во втором кадре данных, чтобы идентификатор можно было заменить на имя, как показано в результате;

enter image description here

Таким образом, как вы можете видеть в выводе результата, None остается как None (можно заменить numpy N / As), а имена во втором информационном кадре теперь заменяются соответствующими Идентификатор модели s в первом кадре данных.

Я с нетерпением жду ваших решений!

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Первая попытка ответить на вопрос по питону, поэтому, хотя это, безусловно, дольше, чем ответ coldspeed, для меня имеет больше смысла использовать функции melt, merge и pivot.

import pandas as pd
import numpy as np

# make an object from the first dataset

df_1 = pd.DataFrame(
  {"ID" : [100, 101, 102, 103, 104],
  "Name" : ["A", "B", "C", "D", "E"],
  "Linked Model 1" : [1111, 1112, np.nan, 1114, 1114],
  "Linked Model 2" : [1112, 1113, np.nan, np.nan, 1111],
  "Linked Model 3" : [np.nan, 1115, np.nan, np.nan, 1112]})

# make an object for the second data set

df_2 = pd.DataFrame(
  {"Model ID" : [1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118],
  "Name" : ["A", "A,B", "C", "D", "Q", "Z", "E", "W"]})

# tidy the data
df_1 = pd.melt(df_1, ["ID", "Name"]) 

# left join the second data set
df_1 = pd.merge(df_1, df_2, how='left', left_on='value', right_on='Model ID').reset_index()

#pivot the data back out to achieve the desired format
df_1 = df_1.pivot_table(index='ID', 
                        columns='variable', 
                        values='Name_y', 
                        aggfunc='first', 
                        dropna=False))

variable Linked Model 1 Linked Model 2 Linked Model 3
ID                                                   
100                   A            A,B            NaN
101                 A,B              C              Q
102                 NaN            NaN            NaN
103                   D            NaN            NaN
104                   D              A            A,B
0 голосов
/ 17 декабря 2018

Инициализируйте словарь замены и используйте df.replace, чтобы сопоставить эти идентификаторы с именами.

m = df2.set_index('Model ID')['Name'].to_dict()
v = df.filter(like='Linked Model')
df[v.columns] = v.replace(m)

df
    ID Name Linked Model 1 Linked Model 2 Linked Model 3
0  100    A              A            A,B            NaN
1  101    B            A,B              C              Q
2  102    C            NaN            NaN            NaN
3  103    D              D            NaN            NaN
4  104    E              D              A            A,B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...