Панды: проверьте два кадра данных на соответствие значений, затем заполните строку в зависимости от метки - PullRequest
0 голосов
/ 31 августа 2018

Я в основном использовал MATLAB на протяжении всего колледжа в качестве математического предмета, а мои программы сводились к построению математических уравнений и моделированию. Сейчас я учусь использовать Python и, в частности, панд. Я пытаюсь найти значения в столбце одного фрейма данных и сопоставить их со значением в столбце другого фрейма данных. Если они совпадают, я хочу, чтобы они дали метку исходному фрейму данных.

Например, у меня есть мой первый столбец сотрудников, и я хочу выяснить, является ли aliceB занятым или не занятым в моем первом кадре данных, и пометить как таковой в столбце col3.

df1 = {"col1":["aliceA", "aliceB", "aliceC"], "col2":["CO", "WA", "PA"]}
df1 = pd.DataFrame(df1)
df1['col3'] = np.nan
In[]df1
Out[]: 
     col1 col2  col3
0  aliceA   CO   NaN
1  aliceB   WA   NaN
2  aliceC   PA   NaN

df2 = {'col1': ["aliceB", "aliceA", "aliceC",  "bobC", "bobB", "bobA",], 'col2': ['Busy','Non-Busy','Busy','Non-Busy','Non-Busy','Busy']}
df2 = pd.DataFrame(df2)
In[]df2
Out[]: 
     col1      col2
0  aliceB      Busy
1  aliceA  Non-Busy
2  aliceC      Busy
3    bobC  Non-Busy
4    bobB  Non-Busy
5    bobA      Busy

***Preferred Output***
Out[]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

Для такого рода проблем MATLAB я бы взял две мои матрицы и перебрал, используя вложенные циклы for, чтобы найти значение. В Python я сделал:

for i in range(0, df2.shape[0]):
        for j in range(0, df1.shape[0]):
            if(df2.col1[i] == df1.col1[j]):
                df1.col3[j] = df2.col2[i]   

Но я получаю это предупреждение, и мне нужно Control + C, чтобы выйти из него, чтобы продолжить:

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

df1
Out[]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy

Технически этот код работает, и мои данные заполнены, но я знаю, что это, вероятно, плохой способ решения моей проблемы. Для этого небольшого примера это не заставляет меня использовать Control + C, но делает, когда мой df1 имеет длину в тысячи строк.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Использование merge:

df1.merge(df2.rename(columns={'col2': 'col3'}), on='col1')

     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy
0 голосов
/ 31 августа 2018

Простой map

df1.col3=df1.col1.map(df2.set_index('col1').col2)
df1
Out[31]: 
     col1 col2      col3
0  aliceA   CO  Non-Busy
1  aliceB   WA      Busy
2  aliceC   PA      Busy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...