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

2024-04-29 04:13:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我的两个样品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上合并两个df,这非常简单。但如果在df2中找不到该值,我想查看一个范围。
e、 g.如果为NaN,则应进一步查看它是否在11到13之间,然后应为“C”,如果它在14到18之间,则应返回“D”,如果在19到25之间,则结果应为“e”。你知道吗


Tags: df样品columnnandf1df2column1column2
2条回答

与左连接合并,然后相应地重新填充。 更新:

df1 = df1.merge(df2, on=['Column1'], how='left)
fill_dict = {11: 'A', 12: 'A', ...}
df1['Column1'] = df1['Column1'].fillna(df1['Column2'].apply(fill_dict))

您需要使用merge并用fillna()替换nan。你知道吗

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\u dict dictionary,您可以使用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\ u dict 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的范围创建dict,因为您的数据有浮点值,我想到了使用np.arange(),但是用十进制精度识别正确的键有点问题。所以,我想写一个函数来生成密钥。我确信这在性能方面是不高效的。但它完成了任务。应该有其他有效的解决办法。你知道吗

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,并使用startstop值将其附加到fill dict中,step应该是递增的方式。根据您共享的数据,我假设步长为0.0001,但这对于dict来说太多了。您可以根据您的需求考虑将step减少到0.1或0.01的方法。你知道吗

相关问题 更多 >