自动比较数据框的多个列并将数据存储到新列中的过程

时间:2019-02-22 12:06:07

标签: python pandas dataframe

我有一个导入为数据框的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

我必须相互比较需要的列。这是代码:

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

此代码对我有用,但是我有大型数据集,这只是该数据的一部分。我有100列,所以对我来说每次编写此代码都是不可行的。我想自动化将一列与另一列进行比较的过程,但是我不知道如何做。如果你们能帮助我,那太好了。

1 个答案:

答案 0 :(得分:3)

首先将shift的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