gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:55 25 4
gpt4 key购买 nike

我有一个作为数据框导入的 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 then ,则应更新 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 多个专栏,每次都写这段代码对我来说是不可行的。我想自动执行将一列与另一列进行比较的过程,但我不知道该怎么做。如果你们能帮助我,那就太好了。

最佳答案

先比较shift使用 DataFrame.eq 编辑 DataFrame , 然后使用 numpy.select通过 2 个 bool 掩码设置值,调用 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

关于python - 自动化比较数据框的多列并将数据存储到新列中的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54826766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com