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
,那将会很有效
如何结合使用isin
和query
来实现这一目标?
答案 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'