pandas内部合并两个不同大小的dfs,检查一个df的值是否在第二个df的范围内并将其存储到另一个df中

时间:2018-03-17 19:12:37

标签: python pandas dataframe

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

1)为了执行两个不同大小的数据帧的内部合并以检查交叉值并存储到第三个数据帧,df1和df2的维度如下:df1.shape是(10000,1893)和df2。形状是(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]

我不明白为什么我只得到一个空数据帧而只返回列标题。谁能告诉我我做错了什么?

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

这是我的第二部分代码:

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()方法,但我也无法让它们工作。谁能提出解决这些问题的好方法呢?

1 个答案:

答案 0 :(得分: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