gpt4 book ai didi

python - 基于 Python 中另一行的范围中的行值

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

我的两个示例 df 如下。

df1

Column1
1
2
3
4
5
6
7
8
9
10
11
12
13

df2

Column 1   Column2 
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J

我想要的是在 df1 上合并两个 dfs,这非常简单。但如果在 df2 中找不到该值,我想查看一个范围。
例如如果 NaN 那么它应该进一步查看它是否在 11 到 13 之间,那么它应该“C”,如果它在 14 到 18 之间,它应该返回“D”,如果在 19-25 之间结果应该是“E”。

最佳答案

您需要使用合并并将 NaN 替换为 fillna()

df1 = pd.DataFrame({'Column1': range(1,26)})
df2 = pd.DataFrame({'Column1': range(1,11),
'Column2': ['A','B','C','D','E','F','G','H','I','J']})

df1 = df1.merge(df2, on=['Column1'], how='left')
fill_dict = {11: 'C', 12: 'C', 13: 'C',
14: 'D', 15: 'D', 16: 'D', 17: 'D', 18: 'D',
19: 'E', 20: 'E', 21: 'E', 22: 'E', 23: 'E', 24: 'E', 25: 'E'}

df1['Column2'] = df1.replace({'Column1':fill_dict})

print(df1)

输出:

    Column1 Column2
0 1 1
1 2 2
2 3 3
3 4 4
4 5 5
5 6 6
6 7 7
7 8 8
8 9 9
9 10 10
10 11 C
11 12 C
12 13 C
13 14 D
14 15 D
15 16 D
16 17 D
17 18 D
18 19 E
19 20 E
20 21 E
21 22 E
22 23 E
23 24 E
24 25 E

编辑1:

如果您有一个范围来创建 fill_dict 字典,您可以使用 dict.fromkeys()

fill_dict = dict.fromkeys(range(11,14),'C')
fill_dict.update(dict.fromkeys(range(14,19),'D'))
fill_dict.update(dict.fromkeys(range(19,26),'E'))

或者您也可以使用列表理解来创建 fill_dict 字典

fill_dict = dict([(i, 'C') for i in range(11, 14)] + 
[(i, 'D') for i in range(14, 19)] +
[(i, 'E') for i in range(19, 26)])

编辑2:

根据我们的聊天对话,您可以尝试一下:

由于您的数据具有浮点值,所以我没有使用 int 范围创建字典,而是考虑使用 np.arange()但用小数精度识别正确的 key 有点问题。所以,我想到编写一个函数来生成 key 。我确信这在性能方面效率不高。但它完成了工作。应该有其他一些有效的解决方案。

import pandas as pd
import decimal

def gen_float_range(start, stop, step):
while start < stop:
yield float(start)
start += decimal.Decimal(step)

base1 = pd.DataFrame({'HS CODE': [5004.0000,5005.0000,5006.0000,5007.1000,5007.2000,6115.950,6115.950,6115.960,6115.960,6115.950]})
base2 = pd.DataFrame({'HS CODE': [5004.0000,5005.0000,5006.0000,5007.1000,5007.2000],
'%age': 0.4})

base1 = base1.merge(base2, on=['HS CODE'], how='left')

fill_dict = dict.fromkeys(list(gen_float_range(6110,6121,0.0001)),'0.06')
# base1['%age'] = base1.replace({'HS CODE':fill_dict})
base1['%age'] = base1['%age'].fillna(base1['HS CODE'].map(fill_dict))
print(base1)

输出:

   HS CODE  %age
0 5004.00 0.4
1 5005.00 0.4
2 5006.00 0.4
3 5007.10 0.4
4 5007.20 0.4
5 6115.95 0.06
6 6115.95 0.06
7 6115.96 0.06
8 6115.96 0.06
9 6115.95 0.06

您必须创建具有不同范围的 fill_dict 并使用 start 附加到您的 fill_dict和stop值和 step应该是你如何增加。根据您共享的数据,我假设步长为 0.0001,但这对于字典来说太大了。您可以查看减少 step 的方法根据您的要求为 0.1 或 0.01。

关于python - 基于 Python 中另一行的范围中的行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265032/

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