|  | 
 
| 
手头一组数据,因存在缺失的情况,需进行填充处理。
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  数据大致情况为:
 1. 为数十家企业的时间记录数据;
 2. 每家企业的数据情况各不相同,需分组进行填充;
 3. 因数据缺失情况各不相同,因此,暂考虑填充的原则是:
 1)如数据缺失量超过该企业数据量的一半以上,则缺失处直接填充数值0;----缺失较多,说明很可能平时数据就是0。
 2)如数据缺失量较少,则按照线性插值法填充数据;---数据缺失较少,说明平时应有数据,无法找出其规律,暂以线性插值,来近似替代。
 数据结构如下:
 
   
 我自己写了代码,但是对于4W+的数据,其运行速度很慢。。想不出,如何利用内置方法来快速处理。。
 
 复制代码data_new = pd.DataFrame(columns=data0_new.columns) #先创建个空列表,方便后期合并
for i in data['COMPANY'].unique(): #分别针对每家企业进行填充缺失值
    data_new1 = data[data['EQP_ID'] == i] #提取每家企业的数据
    for i2 in data_new1.columns: #对每个字段进行遍历
        if data_new1[i2].isnull().sum()> data_new1.shape[0]/2 : # 缺失值情况超过一半,则直接填充指定值。
            data_new1[i2].fillna(0,inplace=True) #对其他值填充数值0
        else:
            data_new1[i2].interpolate(method='linear',limit_direction = 'both',inplace=True) #数据缺失未超过一半的,按线性插值法填充
    data_new = pd.concat([data_new,data_new1],axis=0,sort=True) #拼接每家企业的数据表
 求高手帮忙~~
 
复制代码import pandas as pd
# data.csv 是我随机生成的 48 行 5 列['COMPANY', 'X1', 'X2', 'X3', 'X4']的数据,并随机填充了空值
data = pd.read_csv('data.csv')
def f1(df):
    # 这里的 df 其实就是 groupby 后形成的 DataFrame
    # 调用 df 的 apply 方法,传入 f2,按列操作,得到填充后的 DataFrame 并返回
    result = df.apply(f2, axis=0)
    return result
def f2(s):
    # 这里的 s 是函数 f1 中 df 的每一列数据
    # 判断该列数据缺失值是否超过一半,若超过则填充 0;否则线性填充
    if s.isnull().sum() > len(s):
        result = s.fillna(0)
    else:
        result = s.interpolate(method='linear', limit_direction='both')
    return result
# 将 data 按 COMPANY 分组后,调用 apply 方法,传入 f1,得到填充好的 48 行 4 列 的 DataFrame
data_fill = data.groupby('COMPANY').apply(f1)
# 用 data_fill 覆盖掉 data 的后四列
data.iloc[:, -4:] = data_fill
print(data)
 data.zip
(1.41 KB, 下载次数: 1) 
可能和你实际处理的过程有些区别,仅供参考 | 
 |