gpt4 book ai didi

python - Pandas:如何按相关列组合数据帧,没有完全匹配,并且可能存在内部重复?

转载 作者:行者123 更新时间:2023-12-01 08:09:10 25 4
gpt4 key购买 nike

这个问题与 Pandas: How to combine two dataframes by closest index match? 相关,但不完全相同。

给定两个数据帧 df1[['A1', 'B1']]df2[['A2', 'B2']],我想将它们组合起来,这样我最终得到一个数据帧 df3[['A2, 'B2', 'B1', 'A1']] 其中 'A1' 的所有值已与最接近 'B1''B2' 匹配。下面是一个示例,您将在最后找到完整的数据示例和可重现的代码。

df1:(重复 B1 = -9.33)

       A1     B1
0 -128.65 -12.30
1 -117.74 -11.98
2 -117.19 -11.91
3 -109.43 -10.03
4 -93.75 -9.33
5 -87.27 -9.33
6 -85.59 -5.96
7 -76.18 -5.51

df2:

       A2     B2
0 -69.06 -12.64
1 -86.88 -12.12
2 -95.95 -11.35
3 -103.87 -10.67
4 -105.78 -9.63
5 -108.11 -9.20
6 -111.07 -9.06
7 -126.42 -6.37

请注意 df2['A2'] 是降序排列,而所有其他列都是升序排列。

所需输出:

       A2     B2     B1   A1
0 -69.06 -12.64 -12.30 -128.65
1 -86.88 -12.12 -11.98 -117.74
2 -95.95 -11.35 -10.03 -109.43
3 -103.87 -10.67 -10.03 -109.43
4 -105.78 -9.63 -9.33 -87.27
5 -108.11 -9.20 -9.33 -87.27
6 -111.07 -9.06 -5.96 -85.59
7 -126.42 -6.37 -5.96 -85.59

注意事项:

df2['B2']=-12.12 的正确匹配是 df1['B1']=-11.98 以及相应的 df['A1' ]=-117.74,因为 df2['B2']=-12.12 大于 df2['B2']=-12.30 并且 - 11.98 是本专栏中的下一步。

对于重复值 df1['B1'].iloc[4] = df1['B1'].iloc[5] = -9.33, df1['A1'] = -87.27 是正确的匹配,因为它是最大值。

如果最好的解决方案包括将某些列设置为索引,我根本不介意!

这是一个可重现的代码片段:

#imports
import numpy as np
import pandas as pd

# Some sample data
np.random.seed(1234)

data1 = {'A1':sorted(np.random.normal(100, 20, 8)*-1),
'B1':sorted(np.random.normal(10, 2, 8)*-1)}


data2 = {'A2':sorted(np.random.normal(100, 20, 8)*-1,reverse = True),
'B2':sorted(np.random.normal(10, 2, 8)*-1)}

# Two dataframes
df1 = pd.DataFrame(data1).round(2)
df2 = pd.DataFrame(data2).round(2)

# Duplicate scenario 1: Duplicate A1 values
df1['B1'].iloc[4] = df1['B1'].iloc[5]

谢谢您的建议!

最佳答案

这是在第一次处理重复项之后的pd.merge_asof。对 'A1' 进行排序,然后删除 'B1' 上的重复项,为每个唯一的 'B1 留下 'A1' 的最大值':

import pandas as pd
#df2 = df2.sort_values('B2') # If not sorted by `B2`

pd.merge_asof(df2,
df1.sort_values('A1').drop_duplicates('B1', keep='last').sort_values('B1'),
left_on='B2', right_on='B1', direction='forward')

输出:

       A2     B2      A1     B1
0 -69.06 -12.64 -128.65 -12.30
1 -86.88 -12.12 -117.74 -11.98
2 -95.95 -11.35 -109.43 -10.03
3 -103.87 -10.67 -109.43 -10.03
4 -105.78 -9.63 -87.27 -9.33
5 -108.11 -9.20 -85.59 -5.96
6 -111.07 -9.06 -85.59 -5.96
7 -126.42 -6.37 -85.59 -5.96
<小时/>

如果您需要保留原始顺序,请考虑重置索引,以便在合并后将其添加为列,然后将其设置回来并对索引进行排序。

关于python - Pandas:如何按相关列组合数据帧,没有完全匹配,并且可能存在内部重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55367405/

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