Cha*_*man 3 python loops pandas
创建一些测试数据:
import pandas as pd
import numpy as np
ID = pd.DataFrame(np.random.randint(0,1000000,size=(100, 1)), columns=['ID'])
Prob = pd.DataFrame(np.random.randint(0, 100,size=(100, 1)), columns=['Probability'])/100
cuts = [{'flag': 'L', 'cut': 44},
{'flag': 'M', 'cut': 31},
{'flag': 'H', 'cut': 25}]
cuts = pd.DataFrame(cuts)
df = pd.concat([ID.reset_index(drop=True), Prob], axis=1)
df = df.sort_values(by=['Probability'])
df["flag"] = np.nan
Run Code Online (Sandbox Code Playgroud)
我有两个我正在使用的数据集,一个是来自预测模型的概率列表,另一个是根据给出的列表长度计算的切割点列表.我想找到一种有效的方法将这些值分配给df的'flag'列.
对于此示例,前44行将被指定为"L",接下来的31行将被指定为"M",最后25行将被指定为"H"
我的环境有更多不同的标志值和数百万行但是为了简单起见,我在示例中使用了100行和3个标志.
如何使用"下一个x行数"而不是索引或其他一些引用键来分配这些标志?
用途repeat:
df['flag'] = cuts['flag'].repeat(cuts['cut']).values
Run Code Online (Sandbox Code Playgroud)
输出:
ID Probability flag
1 803927 0.02 L
50 356764 0.03 L
52 132415 0.03 L
28 699693 0.03 L
20 296581 0.03 L
.
.
.
76 236620 0.97 H
70 56385 0.99 H
92 205281 0.99 H
75 804810 0.99 H
29 773553 0.99 H
Run Code Online (Sandbox Code Playgroud)