我有一个导入为数据框的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列,所以对我来说每次编写此代码都是不可行的。我想自动化将一列与另一列进行比较的过程,但是我不知道如何做。如果你们能帮助我,那太好了。
答案 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