比较两个数据帧并将结果存储在另一个数据帧中

时间:2020-10-09 15:08:28

标签: python pandas dataframe for-loop if-statement

我有两个这样的数据帧:第一个有一列和720行(数据帧A),第二个有十列和720行(数据帧B)。数据框仅包含数值。

我正在尝试通过以下方式对其进行比较:我想遍历数据帧B的每一列,并将该列的每个单元格(行)与数据帧A中的对应行进行比较。 (例如:对于数据框B的第一列,我将数据框A的第一行与第一行进行比较,然后将B的第二行与A的第二行进行比较,依此类推。)

基本上,我想逐行比较数据框B的每一列与数据框A中的单列。

如果数据框B中的值小于或等于数据框A中的值,我想将+1添加到另一个数据框(或列表,具体取决于它的难易程度)。最后,我想删除数据帧B中任何没有至少一个单元格来满足条件的列(基本上,如果添加到列表或新数据帧的值为0)。

我尝试过这样的事情(写成一行,我当时想使用它创建一个for循环),但是它似乎并没有达到我想要的效果:

DfA_i = pd.DataFrame(DA.iloc[i])
DfB_j = pd.DataFrame(DB.iloc[j])
B = DfB_j.values
DfC['Criteria'] = DfA_i.apply(lambda x: len(np.where(x.values <= B)), axis=1)
dv = dt_dens.values
if dv[1] < 1:
            DF = DA.drop(i)

我希望我已经清楚地说明了我的问题,对于任何错误,我们深表歉意。感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

让我们尝试一下:

dfB.loc[:, dfB.ge(dfA.values).any()]

说明dfA.values返回形状为(720,1)的numpy数组。然后dfB.ge(dfA.values)dfB中的每一列与dfA中的每一列进行比较;这将返回一个与dfB大小相同的布尔数据框。最后,.any()沿着布尔数据框的列检查是否有任何True

答案 1 :(得分:0)

这如何:

pd.DataFrame(np.where(A.to_numpy() <= B.to_numpy(),1,np.nan), columns=B.columns, index=A.index).dropna(how='all')

您并将np.nan条件下的np.where替换为所需的任何值,包括保留dataframe 'B'的原始值