Как я могу обновить значения столбца в кадре данных на основе его существования в другом кадре данных

avatar
SIUV
1 июля 2021 в 21:24
37
2
0
import pandas as pd
import numpy as np
from numpy.random import randint
from IPython.display import display, HTML
dict_1 = {'col1':range(0,21),'col3':0}
dict_2 = {'col2':range(0,41,4)}
df = pd.DataFrame(dict_1)
df_2 = pd.DataFrame(dict_2)

Итак, цель состоит в том, чтобы сравнить все значения в df['col1'] в df_2['col2'] и для каждой строки, которая равна другой, мне нужно обновить col3 до 1 или некоторого значения, отличного от того, что есть сейчас

в данном случае ищу что-то вроде:

df = pd.DataFrame({'col1':[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],'col3':[1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1]}
Источник
Henry Ecker
1 июля 2021 в 21:34
0

Что-то вроде df.merge(df_2, left_on='col1', right_on='col2')[['col1']].assign(col3=1)?

SIUV
1 июля 2021 в 21:40
0

@HenryEcker не совсем то, что генерирует новый фрейм данных, и я понимаю, что это не то, что я ищу, я пытаюсь обновить существующий.

Ответы (2)

avatar
Henry Ecker
1 июля 2021 в 21:47
0

Один из вариантов: isin + np.where

df['col3'] = np.where(df['col1'].isin(df_2['col2']), 1, 0)

df.head():

    col1  col3
0      0     1
1      1     0
2      2     0
3      3     0
4      4     1

Edit to include col4 with left merge and use np.where to set values ​​based on where col4 (values ​​from df2) is nan:

Дано

df = pd.DataFrame({'col1': range(0, 21), 'col3': 0})
df_2 = pd.DataFrame({'col2': [0, 4, 8, 12, 16],
                     'col4': ['a', 'b', 'c', 'd', 'e']})
df = df.merge(
    df_2, left_on='col1', right_on='col2', how='left'
).drop(columns='col2').fillna('')
df['col3'] = np.where(df['col4'].isna(), 0, 1)

df.head():

    col1  col3 col4
0      0     1    a
1      1     0     
2      2     0     
3      3     0     
4      4     1    b
SIUV
1 июля 2021 в 22:08
0

как мне действовать, если я хочу изменить значение нескольких столбцов на основе результата np.where(). Итак, скажем, у df есть еще один столбец с именем col 4, и я хотел, чтобы он равнялся col2, когда бы он ни совпадал с col1.

SIUV
1 июля 2021 в 22:11
0

Не совсем так, столбец 3 просто проверяет доступность, а столбец 4 сохраняет значение из df_2, когда значения совпадают.

SIUV
1 июля 2021 в 22:22
0

Я обновил ur sol при слиянии, начиная с df=, в основном df — это ожидаемый результат при слиянии df и df_2.

Henry Ecker
1 июля 2021 в 22:27
0

Подождите, на самом деле была опечатка.

SIUV
1 июля 2021 в 22:28
0

то, что я сказал, имеет смысл?

Henry Ecker
1 июля 2021 в 22:29
0

Опять же, было бы лучше, если бы вы отредактировали свой вопрос, чтобы указать, что вы ищете.

avatar
Carlos Melus
1 июля 2021 в 21:53
0

Вы можете сделать это напрямую с пандами:

df_1['col3'] = df_1['col1'].isin(df_2['col2']).astype(int)