【问题标题】:pandas inner merging of two different sizes dfs, checking if values of one df is in range of second df and store it into another dfpandas内部合并两个不同大小的dfs,检查一个df的值是否在第二个df的范围内并将其存储到另一个df中
【发布时间】:2018-03-17 19:12:37
【问题描述】:

我有两个问题,因为我正在尝试执行以下操作:

1) 对两个不同大小的数据帧进行内部合并以检查相交值并存储到第三个数据帧中,df1 和 df2 的维度如下:df1.shape 为 (10000, 1893) 和 df2。 shape 为 (90000, 1893),具有相同的列标题。

2) 如果我想通过逐元素迭代检查有多少 df2 值适合 df1 值的范围间隔(假设范围在 0.9 * df1 到 1.1 * df1 之间),然后我想要将匹配值存储到第四个数据帧中。

以下是我目前所拥有的代码:

import pandas as pd
import numpy as np

df1 = pd.read_csv('file1.csv', squeeze = True)



           MW            AMW          ...
0          160.17,       8.483,       ...
1          162.20,       7.373,       ...
2          162.16,       7.373,       ...
.          .             .            ...
.          .             .            ...
.          .             .            ...
9997       447.78,       9.329,       ...
9998       447.78,       9.329,       ...
9999       447.78,       9.330,       ...
[10000, 1893]

df2 = pd.read_csv('file2.csv', squeeze = True)

           MW            AMW          ...
0          160.28,       5.724,       ...
1          160.18,       8.009,       ...
2          160.19,       8.009,       ...
.          .             .            ...
.          .             .            ...
.          .             .            ...
89997      447.78,       9.329,       ...
89998      447.78,       9.329,       ...
89999      447.78,       9.329,       ...
[90000, 1893]

对于第一部分,我尝试了以下方法:

df3 = pd.merge(df1, df2, how = 'inner')
print df3

Empty DataFrame Columns: 

[MW, AMW, Sv, Se, Sp, Si, Mv, Me, Mp, Mi, GD, nAT, nSK, nTA, nBT, nBO, nBM, SCBO, RBN, RBF, nAB, nH, nC, nN, nO, nS, nHM, nHet, H%, C%, N%, O%, nCsp3, nCsp2, nCIC, nCIR, TRS, Rperim, Rbrid, MCD, RFD, RCI, NRS, NNRS, nR05, nR06, nR10, nBnz, ARR, D/Dtr05, D/Dtr06, D/Dtr10, ZM1, ZM1V, ZM1Kup, ZM1Mad, ZM1Per, ZM1MulPer, ZM2, ZM2V, ZM2Kup, ZM2Mad, ZM2Per, ZM2MulPer, ON0, ON0V, ON1, ON1V, Qindex, BBI, DBI, SNar, HNar, GNar, Xt, Dz, Ram, BLI, Pol, LPRS, MSD, SPI, PJI2, ECC, AECC, DECC, MDDD, UNIP, CENT, VAR, ICR, SMTI, SMTIV, GMTI, GMTIV, Xu, CSI, Wap, S1K, S2K, ...]
Index: []

[0 rows x 1893 columns]

我不明白为什么我得到一个只有列标题的空数据框。谁能告诉我我做错了什么?

对于第二部分,我尝试创建一个函数来检查任何适合区间范围的值(我从我在 stackflow 上查找的一个问题中得到了这个想法,并且回答的人建议这样做)。但是,我仍然没有得到正确的结果。

这是我的第二部分代码:

def checkfunc(x, df2):
    idx = df2['MW'] == x['MW']
    df2 = df2.loc[idx]
    check = (df2 >= (x * 0.9)) & (df2 <= (x * 1.1))
    return check.any()

df4 = df2[df2.apply(lambda x: checkfunc(x, df2), axis=1)].drop_duplicates()
print df4

对于第二部分,我不断地进入一个根本不收敛的连续迭代。我还查看了 np.where() 和 pd.DataFrame.isin() 方法,但我也无法让它们工作。谁能提出解决这些问题的好方法?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果您没有明确指定on 参数,那么pd.merge() 会使用在两个DataFrame 中具有相同名称所有 列合并DataFrame。

    如果你得到一个空的 DF - 这意味着没有匹配的行(就两个 DF 中具有相同名称的列而言)。

    演示:

    In [4]: d1
    Out[4]:
       A  B  C
    0  1  2  3
    1  4  5  6
    
    In [5]: d2
    Out[5]:
       A  B   C
    0  1  2  30
    1  4  5  60
    
    In [6]: pd.merge(d1, d2)
    Out[6]:
    Empty DataFrame
    Columns: [A, B, C]
    Index: []
    
    In [7]: pd.merge(d1, d2, on=['A','B'])
    Out[7]:
       A  B  C_x  C_y
    0  1  2    3   30
    1  4  5    6   60
    

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2019-09-13
      • 2021-02-19
      • 2021-10-06
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      相关资源
      最近更新 更多