Удалить строки с противоречивой информацией из двух информационных фреймов - PullRequest
0 голосов
/ 05 марта 2020

У меня есть два разных кадра данных, один со всей пользовательской информацией, а другой с записанной информацией от пользователей. Некоторая информация в пользовательском фрейме данных противоречит друг другу, поэтому я хочу удалить этих пользователей из обоих фреймов. Я делаю это для школьного проекта, и они дают подсказку, что я должен использовать a для l oop, но я не могу понять, как использовать это с различными фреймами данных.

В перед этим мне пришлось идентифицировать этих пользователей и поместить их в список:

Проверьте фрейм данных df_users. Вы заметите, что для некоторых пользователей существует более одной строки. Например, некоторые пользователи указали несколько параметров компьютера. Поскольку на данный момент мы не можем спрашивать тех пользователей, какие настройки они фактически использовали, мы отбрасываем этих пользователей и соответствующие испытания.

Укажите, какие пользователи ввели противоречивую информацию, т.е. правую и левую или используют другой компьютер. настройки и назначить их списку неправильных пользователей.

Подсказка: для этих пользователей в фрейме данных будет несколько строк.

#// BEGIN_TODO [ORG_3f] Find the wrong users (1 point)

wrong_users = [df_users[df_users.duplicated(subset='user', keep=False)]['user']]

#// END_TODO [ORG_3f]

wrong_users

, в результате чего

[25905    1598
 25920    1598
 29006    1017
 29019    1017
 Name: user, dtype: int64]

Теперь мне нужно удалить этих пользователей как из df_users, так и из df_trials фреймов данных.

Отменить строки из df_users и df_trials, соответствующие пользователям, которые ввели противоречащие информация.

Подсказка: используйте a для l oop и удалите строки, соответствующие этим пользователям, одну за другой.

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

Некоторые из вещей, которые я ' мы пробовали:

df_trials[df_trials['user'] == df_users[df_users.duplicated('user', keep=False)][['user']]]
df_trials[['user']] == df_users[df_users.duplicated('user', keep=False)][['user']]
for n in df_users:
   df_trials[df_trials['user'] == df_users[df_users.duplicated('user')]]
        df_users.drop_duplicates(subset='user')
for user in df_trials:
    df_trials[df_trials['user'] == wrong_users].drop()

Но я думаю, что совершенно ясно, что я не знаю, с чего начать. Если кто-то может мне помочь, я очень ценю это.

1 Ответ

1 голос
/ 05 марта 2020

Если я правильно понял вашу проблему, вы можете использовать pd.isin () и отменить ее, чтобы сохранить только пользователя, которого нет в вашем wrong_users фрейме данных. Хорошей идеей будет избегать циклов for, где это возможно, так как это отрицает цель векторизованных операций в pandas. Вы можете использовать тильду ~ для отрицания выражения isin(). Вот полный пример.

import pandas as pd

# Create dummy dataframe with (some) duplicated users
all_users = pd.DataFrame({
    "user": ["user1", "user1", "user2", "user3", "user4", "user4"],
    "setting": ["setting1", "setting2", "setting1", "setting1", "setting1", "setting2"]
})
print(all_users)

Что дает:

    user   setting
0  user1  setting1
1  user1  setting2
2  user2  setting1
3  user3  setting1
4  user4  setting1
5  user4  setting2

Как видите, user1 и user4 имеют повторяющиеся записи. Давайте определим те, что вы сделали:

# Identify duplicated users
wrong_users = all_users[all_users.duplicated(subset="user", keep=False)]
print(wrong_users)

Это правильно идентифицирует наши дубликаты:

    user   setting
0  user1  setting1
1  user1  setting2
4  user4  setting1
5  user4  setting2

Давайте оставим только пользователей из нашего all_users фрейма данных, которые не являются in wrong_users:

# Keep only users who are not in "wrong_users"
correct_users = all_users.loc[~all_users.user.isin(wrong_users.user)]
print(correct_users)

, что дает недублированные записи:

    user   setting
2  user2  setting1
3  user3  setting1

EDIT: pd.isin() работает с фреймом данных столбцы (как в моем примере), но также с простыми списками (как в вашем вопросе):

list_of_wrong_users = all_users[all_users.duplicated(subset="user", keep=False)].user.unique().tolist()  # ['user1', 'user4']
correct_users = all_users.loc[~all_users.user.isin(list_of_wrong_users)] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...