如何根据两个数据帧中两三列之间的条件创建一个新的布尔列?

时间:2020-10-25 16:05:15

标签: python pandas dataframe

我有两个大小不同的数据帧,df1df2。我正在尝试检查df1的列中是否存在来自df2的值,并在True的新列中返回Falsedf1。 >

第一个数据框是我的参考。它是从xls文件中提取的。

df1.head(10)
Out[29]: 
    PO Number  Sales Document           SO           DO  Document Number
0  3620556930    9001724124.0 4001458660.0 8001721322.0       1500017748
1  3620556930    9001723883.0 4001458865.0 8001721037.0       1500017540
2  3620556930    9001723884.0 4001459374.0 8001721038.0       1500017541
3  3620556930    9001723885.0 4001458101.0 8001721043.0       1500017542
4  3620547728    9001721907.0 4001457180.0 8001719172.0       1500015786
5  3620556930    9001721908.0 4001457724.0 8001719173.0       1500015787
6    TT030720             nan          nan          nan        700001897
7  3620518726    9600008914.0 5600008655.0 5600008655.0       1500008725
8  3620518726    9600008912.0 5600008653.0 5600008653.0       1500008723
9  3620518726    9600008913.0 5600008654.0 5600008654.0       1500008724

第二个数据框来自我从网站上抓取的表格中。

df2.head(10)
Out[32]: 
        PO No         Doc Type  SUS Doc No                    GR_GA   Inv_SO_DO  Doc Date
0  3620556930   Purchase Order  8001294233                      CSL              27.08.2020
1  3620556930    Goods Receipt  7903307400           Goods Received  4001457724  04.09.2020
2  3620556930    Goods Receipt  7903307457           Goods Accepted  4001457724  04.09.2020
3  3620556930  Payment Request  3102053949              CCM Invoice  9001721908  23.09.2020
4  3620556930    Goods Receipt  7903333326           Goods Received  4001458660  29.09.2020
5  3620556930    Goods Receipt  7903333325           Goods Received  4001458101  29.09.2020
6  3620556930    Goods Receipt  7903333322           Goods Received  4001458865  29.09.2020
7  3620556930    Goods Receipt  7903333327           Goods Accepted  4001458660  29.09.2020
8  3620556930    Goods Receipt  7903333324           Goods Received  4001458660  29.09.2020
9  3620556930    Goods Receipt  7903333329           Goods Accepted  4001458865  29.09.2020

我获取输出的思考过程如下:

  1. 我将在df1中创建另外三个列,名为df1['GR', 'GA', 'Inv']
  2. 我将使用df1['SO']df1['DO']中的值来检查它们是否存在于df2['Inv_SO_DO']中。
  3. 如果值存在,那么我将检查df2['GR_GA']是收货,收货还是发票。然后根据此检查,在列True中返回Falsedf1['GR', 'GA', 'Inv']

我尝试了如下的for循环来创建要为['GA']添加的值的列表,但这只是给了我一个Falses列表。

ga = []
t1 = x.iloc[:,2].values
t2 = y.iloc[:,4].values
t3 = y.iloc[:,3].values
for i in t1:
    for j in t2:
        for k in t3:
            if i == j and k == 'Goods Receipt':
                ga.append('True') 
                
            else:
                ga.append('False')

我最接近解决方案的是另一个问题here。我尝试了代码并对其进行了修改,但结果却不正确。要么是错误,要么是我从错误的链接中编写代码。

任何建议都将受到欢迎!

所需的输出:

df1.head(4)
Out[43]: 
    PO Number  Sales Document           SO           DO  Document Number     GR     GA    Inv
0  3620556930    9001724124.0 4001458660.0 8001721322.0       1500017748   True   True   True
1  3620556930    9001723883.0 4001458865.0 8001721037.0       1500017540   True  False  False
2  3620556930    9001723884.0 4001459374.0 8001721038.0       1500017541  False  False  False
3  3620556930    9001723885.0 4001458101.0 8001721043.0       1500017542   True   True  False

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法如下:

  1. echo get_string_between($string); // result = this is my [tag]dog[/tag] echo get_string_between($string, 0); // result = this is my [tag]dog[/tag] echo get_string_between($string, ''); // result = this is my [tag]dog[/tag] echo get_string_between($string, '[tag]'); // result = dog[/tag] echo get_string_between($string, 0, '[/tag]'); // result = this is my [tag]dog echo get_string_between($string, '', '[/tag]'); // result = this is my [tag]dog echo get_string_between($string, '[tag]', '[/tag]'); // result = dog echo get_string_between($string, '[tag]', strlen($string)); // dog[/tag] df1合并到 df2DO(从左侧)到SO(从右侧) )。请注意,在您的情况下,每个Inv_SO_DO值都对应于SO中的多行,因此也许您需要稍微修改合并逻辑(例如,df2中最近出现的行?) / li>
  2. 使用df2GR_GA列进行“虚拟化”,然后在将虚拟变量转换为pd.get_dummies()类型后,将其与合并df中所需的列连接起来。

例如:

boolean

结果如下:

m = pd.concat([df1.merge(df2, left_on='SO', right_on='Inv_SO_DO', how='inner'),
               df1.merge(df2, left_on='DO', right_on='Inv_SO_DO', how='inner')
              ])

desired_cols = ["PO_Number", "Sales_Document", "SO", "DO", "Document_Number", "CSL", "GoodsAccepted", "GoodsReceived"]
pd.concat([m, pd.get_dummies(m['GR_GA']).astype(bool)], axis=1)[desired_cols]

同样,请注意,由于您在示例 PO_Number Sales_Document SO DO Document_Number CSL GoodsAccepted GoodsReceived CCMInvoice 0 3620556930 9001724124 4001458660 8001721322 1500017748 False False True False 1 3620556930 9001724124 4001458660 8001721322 1500017748 False True False False 2 3620556930 9001724124 4001458660 8001721322 1500017748 False False True False 3 3620556930 9001723883 4001458865 8001721037 1500017540 False False True False 中提供的每个SODO可以匹配df1中的多于1行,因此您可能需要添加有关如何合并的一些自定义逻辑。