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

标签 python pandas

我的两个示例 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/

相关文章:

Python:计算数据框中列的减法

Python:列表函数和 lambda 表达式

python - 过滤带有符号的字符串出现特定时间

python - 从 pandas 流中提取值

python - 对多列进行转换以插入/复制缺失值

python - 在 DataFrame 中为一系列日期创建 id

python - 为什么 list[::-1] 不等于 list[:len(list):-1]?

python - 比较数组时,为什么 "in1d"比 "a==b"慢得多

python - 计算文件中的关键字

python - Pandas 没有用 NaN 正确重新索引