Панды назначают значения столбцов зависят от другого столбца в DF - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующие df,

id    a_id    b_id
1     25      50
1     25      50
2     26      51
2     26      51
3     25      52
3     28      52
3     28      52

У меня есть следующий код для присвоения a_id и b_id -1, в зависимости от того, сколько строк в каждой из них имеет для каждогоid значение в df;если каждое из значений a_id или b_id имеет в точности те же строки / sub-df, что и определенное значение id, эти строки a_id и b_id получают -1;

cluster_ids = df.loc[df['id'] > -1]['id'].unique()

types = ['a_id', 'b_id']

for cluster_id in cluster_ids:
    rows = df.loc[df['id'] == cluster_id]

    for type in types:
        ids = rows[type].values

        match_rows = df.loc[df[type] == ids[0]]

        if match_rows.equals(rows):
           df.loc[match_rows.index, type] = -1

так что результат df будет выглядеть так:

id    a_id    b_id
1     25      -1
1     25      -1
2     -1      -1
2     -1      -1
3     25      -1
3     28      -1
3     28      -1

Мне интересно, есть ли более эффективный способ сделать это.

1 Ответ

0 голосов
/ 04 июня 2018
one_value_for_each_id = df.groupby('id').transform(lambda x: len(set(x)) == 1)

 a_id  b_id
0   True  True
1   True  True
2   True  True
3   True  True
4  False  True
5  False  True
6  False  True

one_id_for_each_value = pd.DataFrame({
    col: df.groupby(col).id.transform(lambda x: len(set(x)) == 1)
    for col in ['a_id', 'b_id']
})

   a_id  b_id
0  False  True
1  False  True
2   True  True
3   True  True
4  False  True
5   True  True
6   True  True

one_to_one_relationship = one_id_for_each_value & one_value_for_each_id

# Set all values that satisfy the one-to-one relationship to `-1`
df.loc[one_to_one_relationship.a_id, 'a_id'] = -1
df.loc[one_to_one_relationship.b_id, 'b_id'] = -1

a_id  b_id
0    25    -1
1    25    -1
2    -1    -1
3    -1    -1
4    25    -1
5    28    -1
6    28    -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...