Python 比较数据帧中的两列,并在另一列中更新结果

Python 比较数据帧中的两列,并在另一列中更新结果,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个excel文件,作为数据框导入。数据集如下所示: rule_id reqid1 reqid2 reqid3 53139 0 0 1 51181 1 1 0 50412 0 1 1 50356 0 0 1 50239 0 1 0

我有一个excel文件,作为数据框导入。数据集如下所示:

rule_id reqid1  reqid2  reqid3  
53139    0         0     1           
51181    1         1     0           
50412    0         1     1           
50356    0         0     1           
50239    0         1     0           
50238    1         1     0           
50014    1         0     1
rule_id reqid1  reqid2  reqid3  comparison1 comparison2 last_comp
53139    0         0     1           NaN         NaN         100
51181    1         1     0           1.0         50.0         0
50412    0         1     1           NaN         1.0          50
50356    0         0     1           NaN         NaN         100
50239    0         1     0           NaN         100.0        0
50238    1         1     0           1.0         50.0         0
50014    1         0     1           100.0       NaN         100
我已将rule_id列转换为索引。我希望结果如下所示:

rule_id reqid1  reqid2  reqid3  
53139    0         0     1           
51181    1         1     0           
50412    0         1     1           
50356    0         0     1           
50239    0         1     0           
50238    1         1     0           
50014    1         0     1
rule_id reqid1  reqid2  reqid3  comparison1 comparison2 last_comp
53139    0         0     1           NaN         NaN         100
51181    1         1     0           1.0         50.0         0
50412    0         1     1           NaN         1.0          50
50356    0         0     1           NaN         NaN         100
50239    0         1     0           NaN         100.0        0
50238    1         1     0           1.0         50.0         0
50014    1         0     1           100.0       NaN         100
comparison1列是reqid1和reqid2之间的值比较,comparison2是reqid2和reqid3之间的值比较,last_comp是reqid3和reqid4之间的值比较,但reqid4不可用。因此,这些值的逻辑是,如果我比较两个列,并且两个列的值都为0,那么新列中将捕获Null值。如果第一列有1,第二列有0,则应捕获100。如果两列都有1,则应在comparison1列中捕获1,但如果在reqid3中该值为0,则应在comparison2 100/2中捕获50。如果在REQUID3中,如果值为0,则应在最后一个_comp列中捕获0,如果值为1,则应捕获100。但是如果reqid2和reqid3都有1,那么应该捕获50个


我无法为此编写代码。任何形式的帮助都将不胜感激

以下是一些简单的代码让您开始:

# Compare method, gets a row containing two values as input
def compare_values(row):
    a = row[0]
    b = row[1]

    # One of the rules
    if a == 1 and b == 0:
        return 100

    # TODO: implement other rules

    return None

# apply the `compare_values` method to all rows of ["reqid1", "reqid2"]
df["comparison1"] = df[["reqid1", "reqid2"]].apply(compare_values, axis=1)

# TODO: comparison2


我留下了一些东西供您实现,以获得您想要的确切输出。但是,使用这种结构,您应该能够进行后续操作。

以下是一些简单的代码,可以帮助您开始:

# Compare method, gets a row containing two values as input
def compare_values(row):
    a = row[0]
    b = row[1]

    # One of the rules
    if a == 1 and b == 0:
        return 100

    # TODO: implement other rules

    return None

# apply the `compare_values` method to all rows of ["reqid1", "reqid2"]
df["comparison1"] = df[["reqid1", "reqid2"]].apply(compare_values, axis=1)

# TODO: comparison2


我留下了一些东西供您实现,以获得您想要的确切输出。但是,使用这种结构,您应该能够贯彻到底。

您需要弄清楚您的逻辑。从您所写的内容来看,这可能包括前两个额外的列,使用pandas作为您的数据帧

import pandas as pd
# data
d = {'rule_id': [53139,51181,50412,50356,50239,50238,50014], 'reqid1':[0,1,0,0,0,1,1], 'reqid2':[0,1,1,0,1,1,0], 'reqid3':[1,0,1,1,0,0,1]}

df = pd.DataFrame(data=d)
# reorder columns
cols = df.columns.tolist()
cols = cols[-1:]+cols[:-1]
df = df[cols]
数据帧:

 rule_id  reqid1  reqid2  reqid3
0    53139       0       0       1
1    51181       1       1       0
2    50412       0       1       1
3    50356       0       0       1
4    50239       0       1       0
5    50238       1       1       0
6    50014       1       0       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,c1: b if b==c else (b if b < c else 100/(b+c1)), df.reqid2, df.reqid3, df.comp1 ))
df['comp2']=c2


# convert your zeros to Nans with numpy:
import numpy as np

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

你需要弄清楚你的逻辑。从您所写的内容来看,这可能包括前两个额外的列,使用pandas作为您的数据帧

import pandas as pd
# data
d = {'rule_id': [53139,51181,50412,50356,50239,50238,50014], 'reqid1':[0,1,0,0,0,1,1], 'reqid2':[0,1,1,0,1,1,0], 'reqid3':[1,0,1,1,0,0,1]}

df = pd.DataFrame(data=d)
# reorder columns
cols = df.columns.tolist()
cols = cols[-1:]+cols[:-1]
df = df[cols]
数据帧:

 rule_id  reqid1  reqid2  reqid3
0    53139       0       0       1
1    51181       1       1       0
2    50412       0       1       1
3    50356       0       0       1
4    50239       0       1       0
5    50238       1       1       0
6    50014       1       0       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,c1: b if b==c else (b if b < c else 100/(b+c1)), df.reqid2, df.reqid3, df.comp1 ))
df['comp2']=c2


# convert your zeros to Nans with numpy:
import numpy as np

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

谢谢你。我现在就去做。如果我遇到任何问题,我会在这里发帖。谢谢。我现在就去做。如果我偶然发现任何问题,我会在这里发布。这个代码对我@tasha有效,但我有多个reqid列,在代码中输入每个reqid是不可行的。你能给我一些建议吗,这样我就不必输入reqid了,我只需要提到数据框,它会计算列数,并将一列与另一列进行比较。这可以很容易地适应多个列。但请举个例子。比较是否仅适用于前面的2-3列?结果的列数会增加一倍吗(索引id减去1)?我得到了我想要的结果@tasha。对不起,我没有在这篇文章中提到它。@sagarkhanna好的,太好了!该代码适用于我@tasha,但我有多个reqid列,在代码中输入每个reqid是不可行的。你能给我一些建议吗,这样我就不必输入reqid了,我只需要提到数据框,它会计算列数,并将一列与另一列进行比较。这可以很容易地适应多个列。但请举个例子。比较是否仅适用于前面的2-3列?结果的列数会增加一倍吗(索引id减去1)?我得到了我想要的结果@tasha。对不起,我没有在这篇文章中提到它。@sagarkhanna好的,太好了!