Pandas 合并和应用或分配功能不起作用

问题描述 投票:0回答:1

我对 pandas 数据框进行了一系列操作。

由于某些过滤条件,某些数据帧可能为空。

当我在输入数据帧中有数据时,下面的应用函数正在工作,因为它不会在输入数据帧中没有数据的新列上返回应用逻辑输出。

以下是示例代码。


import pandas as pd
import numpy as np

#df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'p': [11, 12, 13]})
#df2 = pd.DataFrame({'A': [1, 2, 3], 'B': [7, 8, 9], 'q': [21, 22, 23]})

df1 = pd.DataFrame({'A': [], 'B': [], 'p': []})
df2 = pd.DataFrame({'A': [], 'B': [], 'q': []})


merged_df = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
                .assign(D=lambda x: np.where(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y', 
                                             (((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])),'N','NA')
                                             ))

print(merged_df)

上面的代码返回给我一个错误,

ValueError: operands could not be broadcast together with shapes (0,) () (3,)

我使用Apply尝试了以下操作

merged_df1 = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
                .apply(lambda x: 'Y' if (x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q']) else
                       'N' if (x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q']) else None
                       )
                
print(merged_df1)

merged_df1 没有返回任何错误,也没有输出应用函数逻辑

pandas merge apply assign
1个回答
0
投票

您的代码工作正常,但您也必须在内部条件中使用

numpy.where

merged_df = pd.merge(df1, df2, on='A', suffixes=('', '_d'))\
                .assign(D=lambda x: np.where(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y', 
                                             np.where(((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])),'N','NA')
                                             ))

为了完整起见,您还可以使用纯 pandas:

merged_df = (pd
   .merge(df1, df2, on='A', suffixes=('', '_d'))
   .assign(D=lambda x: ((x['B'] == 5) & (x['B_d'] == 8) & (x['p'] > x['q'])).map({True: 'N', False: 'NA'})
                       .mask(((x['B'] == 4) & (x['B_d'] == 7) & (x['p'] < x['q'])), 'Y')
           )
)

输出1:

   A  B   p  B_d   q   D
0  1  4  11    7  21   Y
1  2  5  12    8  22  NA
2  3  6  13    9  23  NA

输出2:

Empty DataFrame
Columns: [B, p, A, B_d, q, D]
Index: []
© www.soinside.com 2019 - 2024. All rights reserved.