我有一个需求,想用每一行的均值和标准差生成随机数来替换每一行。为此需要做如下操作:
- 求出每一行的均值和标准差
- 按照均值和标准差生成相同数量的随机数
- 用随机数替换行的值
# -*- coding: utf-8 -*-
# 你想保留的列索引列表,比如usecols=["1月销量","2月销量","3月销量"]
usecols = ["1月销量","2月销量","3月销量"]
# 读取csv文件
data = pd.read_csv(r"E:\销量报表.csv",usecols=usecols)
# drop掉存在空值的行,看你情况
data.dropna(inplace=True)
# rows表示行数,cols表示列数
rows,cols = data.shape[0],data.shape[1]
"""
生成mymean的Series结构,iloc表示按位置索引,选取所有行,列从0到cols,
我这里就是很简单的从0到 # cols-1,末尾不取,所以写cols,求均值用mean,
由于是求行的均值,写上axis = 1,列均值axis = 0
"""
mymean=data.iloc[:,0:cols].mean(axis =1)
# 标准差同理
mystd=data.iloc[:,0:cols].std(axis = 1)
# 获得dataframe的行索引,构造其中元素都是索引的列表
all_indexs = data._stat_axis.values.tolist()
# 。。。列索引的列表。。。
columns = data.columns.values.tolist()
# enumerate就像一个zip ,i是元素位置,index是元素值
for i,index in enumerate(all_indexs):
# 我这里排了个序,当然看你情况
newrow=np.sort(np.random.normal(loc=mymean.loc[index],scale=mystd.loc[index],size=cols))
data.loc[index,:]=newrow
print(data.head(100))
还是比较笨的方法,没有用到pandas提供的并行计算的力量,效率不高,有没有大佬提供一个进阶版的,求。
有人可能在读取usecols的时候可能会报错:
Non-UTF-8 code starting with '\xe5' in file
加一个??
# -*- coding: utf-8 -*-??
应该能解决问题
pandas和numpy的官方教程写的非常好,多去看看找找会有很多收获的,google stackoverflow 用英文提问也是挺有意思的
|