为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫用相邻的连续值替换少于 n 个连续值

熊猫用相邻的连续值替换少于 n 个连续值

隔江千里 2023-05-05 14:23:32
假设我有以下 DataFrame dfdf = pd.DataFrame({"a" : [8,8,0,8,8,8,8,8,8,8,4,1,4,4,4,4,4,4,4,4,4,4,7,7,4,4,4,4,4,4,4,4,5,5,5,5,5,5,1,1,5,5,5,5,5,5,1,5,1,5,5,5,5]}我想规范化我的数据,如果连续值少于 3 次,则将值更改为相邻的连续值。result:    df = pd.DataFrame({        "a" : [8,8,8,8,8,8,8,8,8,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]}目前我通过手动迭代来完成这项工作,我认为熊猫有特殊的功能来做到这一点。
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

这有点麻烦,使用diff()、cumsum()和np.size来查找组的大小。使用mask()查找小于 3 的组并将其替换为ffill和bfill

s = df.groupby((df['a'].diff() != 0).cumsum()).transform(np.size)

df['a'] = df[['a']].mask(s < 3).ffill().bfill()


#result

[8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 4., 4., 4., 4., 4.,

   4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 5., 5.,

   5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5.,

   5., 5.]


查看完整回答
反对 回复 2023-05-05
?
墨色风雨

TA贡献1853条经验 获得超6个赞

使用NumPy将是有用的:


import numpy as np

import pandas as pd


df = pd.DataFrame({"a" : [8,8,0,8,8,8,8,8,8,8,

                          4,1,4,4,4,4,4,4,4,4,

                          4,4,7,7,4,4,4,4,4,4,

                          4,4,5,5,5,5,5,5,1,1,

                          5,5,5,5,5,5,1,5,4,5,

                          5,5,5]})


arr = df.values.reshape(-1)

sub = arr[1:]-arr[:-1]

add2 = sub[1:]+sub[:-1]  

add3 = sub[2:]+sub[:-2]

del2 = np.where((sub[1:]!=0) & (add2*sub[1:]==0))[0]+1

del3 = np.where((sub[2:]!=0) & (add3*sub[2:]==0))[0]+1

arr[del2] = arr[del2-1]

arr[del3] = arr[del3-1]

arr[del3+1] = arr[del3+2]

df = pd.DataFrame({"a" : arr})

print(arr)


'''

Output:

[8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5

 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]

'''


查看完整回答
反对 回复 2023-05-05
  • 2 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信