Python 有没有办法合并两个数据帧并只保留一定数量的出现?
比如说。如果我有两个数据集:Python 有没有办法合并两个数据帧并只保留一定数量的出现?,python,pandas,merge,Python,Pandas,Merge,比如说。如果我有两个数据集: df1 = pd.DataFrame([[1, 2.1, 5, 0, 'a'], [7, 2.3, 5, 1, 'b'], [0, 2, 0, 1, 'c'], [9, 4, 4, 1, 'd']],columns=list('ABCDE')) df2 = pd.DataFrame([[3, 2, 5, 0, 1, 2], [3, 2.4, 5, 1, 9, 9], [9, 9, 5, 9, 4, 5], [0, 2, 5, 0, 1, 1], [1, 4, 4,
df1 = pd.DataFrame([[1, 2.1, 5, 0, 'a'], [7, 2.3, 5, 1, 'b'], [0, 2, 0, 1, 'c'], [9, 4, 4, 1, 'd']],columns=list('ABCDE'))
df2 = pd.DataFrame([[3, 2, 5, 0, 1, 2], [3, 2.4, 5, 1, 9, 9], [9, 9, 5, 9, 4, 5], [0, 2, 5, 0, 1, 1], [1, 4, 4, 3, 8, 0]],columns=list('xBCyzw'))
我只想基于列“B”和“C”合并它们,但我只希望合并行的实例数量与df1中的相同
换句话说,我想在df2中查找与基于“B”和“C”的df1中的行相匹配的行,并将df2中的列附加到df1中。
我现在拥有的是
print(pd.merge(np.round(df2), np.round(df1), on=['B', 'C'], how='inner', left_index = True))
哪个输出
x B C y z w A D E
0 3 2.0 5 0 1 2 1 0 a
1 3 2.0 5 0 1 2 7 1 b
0 3 2.0 5 1 9 9 1 0 a
1 3 2.0 5 1 9 9 7 1 b
0 0 2.0 5 0 1 1 1 0 a
1 0 2.0 5 0 1 1 7 1 b
3 1 4.0 4 3 8 0 9 1 d
但是因为在df1中只有两行B=2,C=5,所以我希望合并结果中也只有两行。df2中三个匹配行中的哪一个被合并并不重要
例如:
x B C y z w A D E
0 3 2.0 5 0 1 2 1 0 a
1 3 2.0 5 0 1 2 7 1 b
3 1 4.0 4 3 8 0 9 1 d
或:
或:
我想不出比循环更好的方法了
有什么想法吗?首先,轮到
df1
和df2
:
i, j = map(np.round, [df1, df2])
接下来,在B
和C
上合并:
v = pd.merge(i, j, on=['B', 'C'], how='inner', left_index=True)
将虚拟计数列添加到i
和合并结果:
v['Count'] = v.groupby(['B', 'C']).cumcount()
i['Count'] = i.groupby(['B', 'C']).cumcount()
对i
和新计数列执行第二次合并
v.merge(i[['B','C','Count']], on=['B','C','Count']).drop('Count', 1)
A B C D E x y z w
0 1 2.0 5 0 a 3 0 1 2
1 1 2.0 5 0 a 3 1 9 9
2 9 4.0 4 1 d 1 3 8 0
您只更改了输出。而不是产生它的输入。一些预期的结果也会有助于抱歉,我试图解释它而不混淆我自己,每个试图帮助X.XI的人都不能根据这个代码和输入来复制当前的结果。请再试一次,我现在复制了DF'SHIKE的答案吗?
v['Count'] = v.groupby(['B', 'C']).cumcount()
i['Count'] = i.groupby(['B', 'C']).cumcount()
v.merge(i[['B','C','Count']], on=['B','C','Count']).drop('Count', 1)
A B C D E x y z w
0 1 2.0 5 0 a 3 0 1 2
1 1 2.0 5 0 a 3 1 9 9
2 9 4.0 4 1 d 1 3 8 0