gpt4 book ai didi

python - 有没有办法合并两个数据帧并只保留一定数量的出现次数?

转载 作者:行者123 更新时间:2023-11-28 21:37:20 26 4
gpt4 key购买 nike

例如。如果我有两个数据集:

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 中的实例数一样多。

换句话说,我想根据“B”和“C”查找 df2 中与 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

或者:

   x    B  C  y  z  w  A  D  E
0 3 2.0 5 1 9 9 1 0 a
1 3 2.0 5 1 9 9 7 1 b
3 1 4.0 4 3 8 0 9 1 d

或者:

   x    B  C  y  z  w  A  D  E
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

除了循环之外,我想不出更好的方法。

有什么想法吗?

最佳答案

首先,轮df1df2:

i, j = map(np.round, [df1, df2])

接下来,合并 BC:

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

关于python - 有没有办法合并两个数据帧并只保留一定数量的出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49741509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com