Изменить значения для дубликатов в кадре данных панд - PullRequest
0 голосов
/ 25 февраля 2019

Дан фрейм данных

var1  var2  var3  var4  var5
  23     1     0     0     0
  23     0     0     0     1
  43     0     0     0     1
  43     0     1     1     0

Мне нужно проверить значения переменных var2, var3, var4, var5 и изменить двоичные значения, чтобы для строк с дубликатами в var1 все остальные переменные имели одинаковые значения,При решении, какой дубликат должен быть изменен, приоритет отдается var2.Поэтому мне нужно иметь мой окончательный фрейм данных следующим образом:

var1  var2  var3  var4  var5
  23     1     0     0     0
  23     1     0     0     0
  43     0     1     1     1
  43     0     1     1     1

Есть предложения?Спасибо

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Я думаю, что это не очень хорошо объяснено, так как мой ответ получил 2 понижения :) Я надеюсь, что вы простите меня за это, поскольку это мой первый код, облегчающий реализацию набора правил, которые я применял в Excel, но хочуавтоматизировать процесс.Я объясню другими словами.По сути, у меня есть список трансактонов, а var1 - это транзакционный идентификатор.Переменные - это решения, которые я принимаю в отношении каждой транзакции.var2 - отклонить, var3 - исправить;вар4 - принять;var5 - принять и "сделать что-то еще".Для одних и тех же транзакций должно быть принято одно и то же решение.Случилось так, что по некоторым сделкам решение принимается отдельно, причина, по которой у них разные решения.Моя цель - корректировать решения для одних и тех же транзакций одинаково.Что касается решений, отклонение (var2) имеет приоритет. Если одно отклонено, другое также должно быть отклонено.Отсюда и приоритет var2.Если var1 = 1;others = 0 Относительно других переменных.Они могут иметь такие не исключение, например.var3 = 1;var4 = 1;var5 = 1;но в этом случае var2 = 0 (всегда).Важно, чтобы транзакции с одинаковым идентификатором принимали одинаковые решения.Надеюсь, это поможет.

0 голосов
/ 27 февраля 2019

Я думаю, что сделал это.Может быть, это слишком долго, но это работает :) Спасибо, Френчи, еще раз за предложение "groupby"!

import pandas as pd
import numpy as np

df = pd.DataFrame({'var1': [23, 23, 43, 43, 53],
                   'var2': [1, 0, 0, 0,1],
                   'var3': [0, 0, 0, 1, 0],
                   'var4': [0, 0, 0, 1, 0],
                   'var5': [0, 1, 1, 0, 0]})
print(df)

df['Dup'] = np.where(df['var1'].duplicated(keep=False), 'dup', np.nan)

df['var2'] = np.where(df['Dup']=="dup", df.groupby(['var1'])['var2'].transform('max'), df['var2'])
df['var3'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var3'])
df['var4'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var4'])
df['var5'] = np.where((df['Dup']=="dup") & (df['var2']==1), 0 , df['var5'])

df['others_dup'] = np.where((df['Dup']=='dup') & (df['var2']==0), 1, np.nan)

df['var3']=np.where(df['others_dup']==1, df.groupby(['var1'])['var3'].transform('max'), df['var3'])
df['var4']=np.where(df['others_dup']==1, df.groupby(['var1'])['var4'].transform('max'), df['var4'])
df['var5']=np.where(df['others_dup']==1, df.groupby(['var1'])['var5'].transform('max'), df['var5'])

print(df)
0 голосов
/ 25 февраля 2019

если я понял вашу логику:

import pandas as np
df = pd.DataFrame({'var1': [23, 23, 43, 43],
                   'var2': [1, 0, 0, 0],
                   'var3': [0, 0, 0, 1],
                   'var4': [0, 0, 0, 1],
                   'var5': [0, 1, 1, 0]})
print(df)
df['var2'] = df.groupby(['var1'])['var2'].transform('max')
f = 1 - df['var2']
df['var3'], df['var4'],df['var5'] =[f]*3

print(df)

вывод:

var1  var2  var3  var4  var5
  23     1     0     0     0
  23     1     0     0     0
  43     0     1     1     1
  43     0     1     1     1
...