выполнение функции слияния в python, когда я не хочу, чтобы значения повторялись - PullRequest
2 голосов
/ 02 мая 2020

HI Это продолжение одного из моих предыдущих вопросов как мне выполнить эквивалентную операцию vlookup на моем фрейме данных с некоторыми дополнительными условиями

Как и в другом вопросе, мой первый dataframe имеет значение

list = ['Computer', 'AA', 'Monitor', 'BB', 'Printer1', 'BB', 'Desk', 'AA', 'Printer2', 'DD', 'Desk', 'BB']
list2 = [1500, 232, 300, 2323, 150, 2323, 250, 2323, 23, 34, 45, 56]
df = pd.DataFrame(list,columns=['product'])
df['number'] = list2

, и что, если у моего 2-го кадра данных есть несколько значений, скажем, 'AA', как показано ниже

list_n = ['AA','AA','BB','BB','CC','DD']
list_n2 = ['Y','N','N','Y','N','Y']

df2 = pd.DataFrame(list_n,columns=['product'])
df2['to_add'] = list_n2

, и это будет выглядеть

  product to_add
0      AA      Y
1      AA      N
2      BB      N
3      BB      Y
4      CC      N
5      DD      Y

когда я выполняю pd.merge(df, df2, on="product", how="left"), я получаю это

 product  number to_add
0   Computer    1500    NaN
1         AA     232      Y
2         AA     232      N
3    Monitor     300    NaN
4         BB    2323      N
5         BB    2323      Y
6    Printer1     150    NaN
7         BB    2323      N
8         BB    2323      Y
9       Desk     250    NaN
10        AA    2323      Y
11        AA    2323      N
12   Printer2      23    NaN
13        DD      34      Y
14      Desk      45    NaN
15        BB      56      N
16        BB      56      Y

Как вы можете видеть, теперь есть несколько строк для AA и BB. Я просто хочу, чтобы первое значение (или одно из значений) для 'AA' (и 'BB') было перенесено (естественно, без изменения последовательности данных). Короче говоря не хочу несколько строк. просто чтобы уточнить, мой df2 имеет более 6000 строк, и я не знаю, какие записи дублируются.

поэтому ответ должен выглядеть примерно так:

     product  number to_add
0   Computer    1500    NaN
1         AA     232      Y
2    Monitor     300    NaN
3         BB    2323      N
4    Printer1     150    NaN
5         BB    2323      N
6       Desk     250    NaN
7         AA    2323      Y
8    Printer2      23    NaN
9         DD      34      Y
10      Desk      45    NaN
11        BB      56      N

1 Ответ

0 голосов
/ 02 мая 2020

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

df_m = pd.merge(df, df2, on="product", how="left")

m = df_m["product"].isin(df2["product"]) & df_m["product"].eq(df_m["product"].shift())
df_m = df_m[~m].reset_index(drop=True)
print(df_m)

Печать:

     product  number to_add
0   Computer    1500    NaN
1         AA     232      Y
2    Monitor     300    NaN
3         BB    2323      N
4   Printer1     150    NaN
5         BB    2323      N
6       Desk     250    NaN
7         AA    2323      Y
8   Printer2      23    NaN
9         DD      34      N
10      Desk      45    NaN
11        BB      56      N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...