示例数据:
id val1 val2 val3 val4 val5 val6 val7
///+8yr NaN 0.0 2.0 NaN 1 3 23
///1vjh NaN NaN NaN NaN NaN 7 62
///4wu 3 NaN 6 NaN 7 8 180
基本上,我希望能够在这些行中获取超过5的每个值,并用一些分类变量替换它们(即" greaterthan5")。对于val7,我想基于30的间隔对它们进行分组,例如,0-30组合在一起,31-60将组合在一起。
我可以做一个for循环,但我不知道是否有更有效的方法。
答案 0 :(得分:0)
IIUC你有两个问题。使用布尔索引可以实现使用'larger than 5'
替换大于5的值的第一个问题,并且可以使用pd.cut()
实现第二个分组问题
<强>样本:强>
d = pd.read_clipboard()
第1部分
获取不满足大于5个标准的值,
rest = d.loc[:,'val1':'val6'][~(d.loc[:,'val1':'val6'] >5)]
rest
val1 val2 val3 val4 val5 val6
0 NaN 0.0 2.0 NaN 1.0 3.0
1 NaN NaN NaN NaN NaN NaN
2 3.0 NaN NaN NaN NaN NaN
获得大于5的值
larger_than_5=d.loc[:,'val1':'val6'][d.loc[:,'val1':'val6'] >5]
print(larger_than_5)
val1 val2 val3 val4 val5 val6
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN 7.0
2 NaN NaN 6.0 NaN 7.0 8.0
使用您的逻辑进行更新
larger_than_5[larger_than_5.notnull()] ='Larger than 5'
print(larger_than_5)
val1 val2 val3 val4 val5 val6
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN Larger than 5
2 NaN NaN Larger than 5 NaN Larger than 5 Larger than 5
使用逻辑
更新rest
rest.update(larger_than_5)
print(rest)
val1 val2 val3 val4 val5 val6
0 NaN 0.0 2 NaN 1 3
1 NaN NaN NaN NaN NaN Larger than 5
2 3.0 NaN Larger than 5 NaN Larger than 5 Larger than 5
根据逻辑1更新原始df的值和更新值
d.loc[:,'val1':'val6'] = rest
print(d)
id val1 val2 val3 val4 val5 val6 \
0 ///+8yr NaN 0.0 2 NaN 1 3
1 ///1vjh NaN NaN NaN NaN NaN Larger than 5
2 ///4wu 3.0 NaN Larger than 5 NaN Larger than 5 Larger than 5
val7
0 23
1 62
2 180
第2部分
获取垃圾箱
bins = np.arange(0, d['val7'].max()+1, 30)
bins
array([ 0, 30, 60, 90, 120, 150, 180], dtype=int64)
制作新系列
val7_groups = pd.cut(d['val7'], bins)
val7_groups
0 (0, 30]
1 (60, 90]
2 (150, 180]
将其添加到数据框
d['val7_groups'] = val7_groups
print(d)
id val1 val2 val3 val4 val5 val6 \
0 ///+8yr NaN 0.0 2 NaN 1 3
1 ///1vjh NaN NaN NaN NaN NaN Larger than 5
2 ///4wu 3.0 NaN Larger than 5 NaN Larger than 5 Larger than 5
val7 val7_groups
0 23 (0, 30]
1 62 (60, 90]
2 180 (150, 180]
您还可以通过将值传递到pd.cut()