首页 > 解决方案 > 在熊猫 python 中,我如何在 DataFrame 中“黑名单”或“白名单”数字

问题描述

我有两个 DataFrame,我想在 df1 中使用第一个允许的数字向 df 添加一个新列,但只有每个组中的数量,当它再次从 1 开始时,它需要查看 Allowed_numbers 中的第一个数字.

df1 = pd.DataFrame({'Allowed_numbers': [3,4,5,6,8,9,12,15,17,24,28,29,30]})
df = pd.DataFrame({'order_out': [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]})

并想要这个:

      order_y  y_goal
0         1       3
1         2       4
2         3       5
3         4       6
4         5       8
5         6       9
6         7      12
7         8      15
8         9      17
9         1       3
10        2       4
11        3       5
12        4       6
13        5       8
14        6       9
15        7      12
16        8      15
17        9      17
...

我尝试了几件事

df= bags.sort_values(['order_out'])
df.loc[:, 'y_goal'] = pd.Series(Allowed_numbers)

得到这个

    order_out y_goal
0         1     3.0
1         2     4.0
2         3     5.0
3         4     6.0
4         5     8.0
5         6     9.0
6         7    12.0
7         8    15.0
8         9    17.0
9         1    24.0
10        2    28.0
11        3    29.0
12        4    30.0
13        5     NaN
14        6     NaN
15        7     NaN
16        8     NaN
17        9     NaN
...

我也在考虑某种相互映射的数字,因为 order_out 中的 1 在 y_goals 中总是 3。order_out 也可能有不同长度的数字行,并不总是最多 9。

标签: pythonpandasdataframe

解决方案


您可以order_out用作 df1 的索引(我们减去 1 以从 1 索引转换为 0 索引):

y_goal = df1['Allowed_numbers'][df['order_out'] - 1]

现在我们可以重置 y_goal 上的索引并巧妙地合并两列:

df['y_goal'] = y_goal.reset_index(drop = True)

推荐阅读