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

У меня есть файл Excel, который я импортировал как фрейм данных.Набор данных выглядит следующим образом:

rule_id  reqid1 reqid2  reqid3  reqid4
53139     0      0       1       0
51181     1      1       1       0
50412     0      1       1       0
50356     0      0       1       0
50239     0      1       0       1
50238     1      1       1       0
50014     1      0       1       1

Я должен сравнить столбцы reqid друг с другом.Это код:

c1 = list(map(lambda a,b: a if a == b else 100*a , df.reqid1 , df.reqid2))
df['comp1'] = c1

c2 = list(map(lambda b,c: b if b == c else 100*b , df.reqid2 , df.reqid3))
df['comp2'] = c2

c3 = list(map(lambda c,d: c if c == d else 100*c , df.reqid3 , df.reqid4))
df['comp3'] = c3

comps = ['comp1' , 'comp2' , 'comp3']
df[comps] = df[comps].replace({0: np.nan})

В основном этот код сравнивает reqid1 с reqid2, reqid2 с reqid3 и так далее.Если оба столбца имеют значение 0, тогда 0 следует обновить во вновь созданном столбце, если оба столбца имеют значение 1, то 1 следует обновить во вновь созданном столбце.Если первый столбец имеет 0, а следующий столбец имеет 1, то NaN должен быть обновлен, а если первый столбец имеет 1, а второй столбец имеет 0, то 100 должно быть обновлено.Я использую другую функцию для последнего столбца.В основном это происходит, если последний столбец (в данном случае reqid4) имеет значение 1, тогда 100 следует обновить в новом столбце, а если значение 0, то 0 следует обновить.Вот код для этого:

def fun(df , col2):
    df['last_comp'] = np.where((df.loc[: , col2] == 1) , 100 , 0)
    return df

Вот результат, который я получаю:

rule_id  reqid1 reqid2  reqid3  reqid4 comp1  comp2    comp3  last_comp
53139      0     0        1      0      NaN    NaN     100.0     0
51181      1     1        1      0      1.0    1.0     100.0     0
50412      0     1        1      0      NaN    1.0     100.0     0
50356      0     0        1      0      NaN    NaN     100.0     0
50239      0     1        0      1      NaN    100.0    NaN     100.0
50238      1     1        1      0      1.0    1.0     100.0     0
50014      1     0        1      1     100.0   NaN      1.0     100.0

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

1 Ответ

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

Сначала сравните shift ed DataFrame с DataFrame.eq, затем используйте numpy.select для установки значений по 2 логической маске, вызовите DataFrameКонструктор и последний join к оригиналу:

m = df.eq(df.shift(-1, axis=1))

arr = np.select([df ==0, m], [np.nan, df], df*100)
#python 3.6+ for rename columns
df2 = pd.DataFrame(arr, index=df.index).rename(columns=lambda x: f'comp{x+1}')
#python bellow
#df2 = pd.DataFrame(arr, index=df.index).rename(columns=lambda x: 'comp{}'.format(x+1))

df3 = df.join(df2).reset_index()
print (df3)
   rule_id  reqid1  reqid2  reqid3  reqid4  comp1  comp2  comp3  comp4
0    53139       0       0       1       0    NaN    NaN  100.0    NaN
1    51181       1       1       1       0    1.0    1.0  100.0    NaN
2    50412       0       1       1       0    NaN    1.0  100.0    NaN
3    50356       0       0       1       0    NaN    NaN  100.0    NaN
4    50239       0       1       0       1    NaN  100.0    NaN  100.0
5    50238       1       1       1       0    1.0    1.0  100.0    NaN
6    50014       1       0       1       1  100.0    NaN    1.0  100.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...