0、注意点:

1.经过大量计算的数据一定要保存下来,节省时间
2.更新数据的命名不要节省,不要因为想省着用名字造成反复多次嵌套的误区
3.reset_index=True必须一直记着,不然很容易导致index相关的报错

一、变量

重命名变量
df.rename(columns={'a1':'b1','a2':'b2'},inplace=True)
构造新变量
【apply+lambda】

df['x2']=df['x1'].apply(lambda x:1 if x>0 else 0)    #if-else

df['x2']=df['x1'].apply(lambda x:10-df.x3)      #运算

def function(x):          #自定义函数
	return y
df['x1'] = df.x2.apply(lambda x:function(x))     

df['x3']=df.apply(lambda y:y['x1']/y['x2'], axis=1)          #涉及两列,必须有axis=1
df['x3']=df.x1/df.x2


【一阶差分】
df['x_delta']=pd.DataFrame(df.x.diff())

【变量在特定行赋值】
data.loc[2:10,'x1']=3

【特征的描述统计量计算】
# 计算某品牌的销售统计量,同学们还可以计算其他特征的统计量
# 这里要以 train 的数据计算统计量,因为这种情况下train和test是要分开的

Train_gb = Train_data.groupby("brand")  #不是表格,但是可以用来遍历,根据类别分类
all_info = {}  #用来记录各种特征统计量

for kind, kind_data in Train_gb:
    info = {}
    kind_data = kind_data[kind_data['price'] > 0]   #筛选数据减少计算成本
    info['brand_amount'] = len(kind_data)
    info['brand_price_max'] = kind_data.price.max()
    info['brand_price_median'] = kind_data.price.median()
    info['brand_price_min'] = kind_data.price.min()
    info['brand_price_sum'] = kind_data.price.sum()
    info['brand_price_std'] = kind_data.price.std()
    info['brand_price_average'] = round(kind_data.price.sum() / (len(kind_data) + 1), 2)
    all_info[kind] = info   #用两层嵌套字典来记录
brand_fe = pd.DataFrame(all_info).T.reset_index().rename(columns={"index": "brand"})
data = data.merge(brand_fe, how='left', on='brand')  #列合并用merge,左连接
给指定行的变量赋值
df.loc[a:b,'x1']=number
索引到变量的具体值

(1)loc&iloc函数:

(2)

df.x[index]

#df0[['t']]是dataframe,df0.t是series
交换变量顺序
df2=df1[['x1','x2', 'x3']]    #变量不能增删

二、表

重置索引【非常重要!!!!】
df=df.reset_index(drop=True)
读取
df=pd.read_csv('df.csv',index_col=0)       #不添加索引列
去重
data2=data.drop_duplicates(subset=['x2','x3']).reset_index(drop=True)  #去重之后索引会改变,需要重置。并且一定要改名字,防止重复累积计算。
df.drop_duplicates(keep='first',inplace=True)  #inplace=True是直接在df的基础上操作,最好还是构造新表
删除缺失值

一般情况下一定不能随便删除异常值,因为对于分类型变量,删除很可能影响其分布。

df=df.dropna().reset_index(drop=True)
df.dropna(axis=0, how='any', subset=['x1'],inplace=True)  #在原数据上进行操作
#
default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的行
随机抽数
df2=df1.sample(n=8000,random_state=123).reset_index(drop=True)    #抽数后要重置索引
按列排序
df2=df1.sort_index(by=['x1','x2']).reset_index(drop=True)   #排序后要重置索引
保存

包含大数据量的计算,如果能够持久化存储,一定要存下来,节省下次计算的大量的宝贵时间。

data.to_csv('data.csv',encoding='utf-8',index_label=False,header=1)   #不包含索引列,包含列名
创建新表
df=pd.DataFrame()   #空表
df['a']=range(1,100)
df['b']=0

# 等同于
df=pd.DataFrame({'a':range(1,100),'b':0})
表转字典
dict=df.x.to_dict()

三、表与表

拼接数据

concat:行连接 / 列连接
merge:相当于sql中的join

#列相同,做行连接
df = pd.concat([df1, df2, df3])   #keys=['x', 'y', 'z']识别来源于哪张表
#列连接,推荐用merge
df = pd.concat([df1, df2], axis=1)   #join='inner'/'outer':交集/并集
df0=pd.merge(df,df_temp2[['device_id','ds','rw']],how='right',on=['device_id','ds','rw']) #从df中删除这异常的13个片段
在循环中叠加输出表
df2=pd.DataFrame()
df2=pd.concat([df2,df1])      #df1是循环结果,df2用来记录累积结果

四、值

众数
from scipy import stats
mode=int(stats.mode(list)[0][0])
构造范围
range(a,b)
无穷值
# 查看是否有无穷值:
np.isfinite(df).all() 
# 替换无穷大数据:
df1=df.replace([np.inf,-np.inf],np.nan).dropna().reset_index(drop=True)
int转float

float的精度更高,数据范围也更广

# 查看数据类型
type(data)
# int转换为float
float(x1)

五、数组

# array的行列重构:
array.reshape(1,-1),-1表示任意正整数

# 数据框转化为array:
df1=df.values
df1=np.asarray(df)