过滤并合并具有不同形状的两个数据框的值

时间:2019-06-09 08:33:46

标签: python-3.x pandas dataframe

df1。列

['Name' 'Age' 'Sex' 'Date Of Birth' 'Location' 'Roll No' 'Height']

df1.shape

#rows, columns

(200,7)

df2。列

['Name' 'Country' 'Home Town' 'Father's Name' 'Mother's Name' 'Mother Tongue' 'Weight' 'Grade' 'Roll No' '10' '15' '110' '170']

df2.shape

#rows, columns

(240,13)

我要合并df1和df2 根据条件:

(df1['Roll No']==df2['Roll No']) and ((df2['10'] < df1['Age'] < df2['12']) and (df2['110']  < df1['Height'] < df2['170']))

组合df4

['Name' 'Age' 'Sex' 'Date Of Birth' 'Location' 'Roll No' 'Height' 'Name' 'Country' 'Home Town' 'Father's Name' 'Mother's Name' 'Mother Tongue' 'Weight' 'Grade' 'Roll No' '10' '15' '110' '170']

如果我们可以删除重复的行Name Roll No,那将会很有效

如何结合使用isinquery来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我准备了您的数据的有限版本:

df1 = pd.DataFrame(data=[
    [ 3, 4, 5, 1],
    [ 3, 7, 4, 2]],
    columns=['A', 'B', 'C', 'F'])
df2 = pd.DataFrame(data=[
    [ 3, 3,  7, 4, 8, 1],
    [ 3, 5,  9, 4, 8, 1],
    [ 3, 5,  9, 3, 5, 2],
    [ 3, 6, 11, 5, 9, 2]],
    columns=['A', 'H', 'I', 'J', 'K', 'F'])

我从 df1 ['G','L','M','N'] 列中删除了 E 列 来自 df2 (它们对于解决方案不是必不可少的)。

要执行任务的第一部分-在 F 列上合并,我们 可以运行:

df3 = df1.merge(df2.drop(columns=['A']), on=['F'])

F 列由 merge 作为连接条件自动消除。 我明确删除了 A 列,因为否则输出 应该包含 A_x A_y 列。

如果您保证两个DataFrame中的 A 列都相等( df1.A == df2.A ), 要合并行,您还可以编写:

df3 = df1.merge(df2), on=['A', 'F'])

或更短:

df3 = df1.merge(df2))

因为默认的合并条件是所有公共列。

请注意,默认合并模式(方式)为内部。如果你想要另一个 可能的合并模式,您应该明确指定它。

第二部分可以使用 query 方法执行:

df3.query('H < B and B < I and J < C and C < K')

请注意,现在所有列都在单个 DataFrame中,因此我们可以 仅使用列名。

对于我的测试数据,结果是:

   A  B  C  F  H  I  J  K
0  3  4  5  1  3  7  4  8
2  3  7  4  2  5  9  3  5

替代方法:您可以使用一条指令完成整个任务,而无需使用 任何中间DataFrame:

df1.merge(df2.drop(columns=['A'])).query('H < B and B < I and J < C and C < K')

另一种选择: query 条件可以更短:

'H < B < I and J < C < K'