鱼C论坛

 找回密码
 立即注册
查看: 2213|回复: 3

pandas如何自动生成多列

[复制链接]
发表于 2019-9-9 18:55:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
手头一组数据,要求进行相关的统计计算,获取某指定列的变化量、变化率、滑窗处理指定长度数据的均值、方差等。
我对单列进行了相关处理,示例代码如下:
  1. seq_len = 7*6
  2. WT_roll = combined_data['WATER_TEMP'].rolling(window = seq_len)  #combined_data为df格式的数据
  3. WT_diff42 = combined_data['WATER_TEMP'].diff(periods = seq_len)
  4. WT_change42 = combined_data['WATER_TEMP'].pct_change(periods = seq_len)
  5. combined_data['WATER_TEMP_mean'] =WT_roll.mean() #求历史记录的均值
  6. combined_data['WATER_TEMP_std'] =WT_roll.std() #求历史记录的标准差
  7. combined_data['WATER_TEMP_diff42'] = WT_diff42 #求 对应时期点的差值
  8. combined_data['WATER_TEMP_change42'] = WT_change42 #求 对应时期点的差值
复制代码


现在需要将这个方法,应用到指定的几列中,同样在原数据基础上,自动生成相应新字段。。
该怎么解决呢?
我自己试着自定义函数来处理,但是一直报各种错。。
  1. test = pd.DataFrame(np.random.randint(0,100,size=(10,5)),columns=['X1','X2','X3','X4','X5'])

  2. seq_len =5
  3. for i in test.columns:
  4.     def feature_roll(data):
  5.         print('data:',data)
  6.         data_mean = data.rolling(seq_len).mean()
  7.         data_std = data.rolling(seq_len).std()
  8.         print('data_mean:',data_mean)
  9.         return data_mean,data_std
  10.     def feature_diff(data):
  11.         data_diff = data.diff(seq_len)
  12.         return data_diff
  13.     def feature_change(data):
  14.         data_change = data.pct_change(seq_len)
  15.         print()
  16.         return data_change
  17.     test['%s_mean'%i],test['%s_std'%i] = test.apply(feature_roll)
  18.     test['%s_diff'%i] = test.apply(feature_diff)
  19.     test['%s_change'%i] = test.apply(feature_change)
复制代码

到底,该如何改代码呢??
求指点
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-9 20:56:27 | 显示全部楼层
本帖最后由 傻纸 于 2019-9-9 22:05 编辑

心累了。。
for i in test.columns:
    def xxx():
        #待执行的语句

这样xxx函数里的语句只会执行一次,在你的例子里相当于

i=x4
def feature_roll(data):
    ……
test['%s_change'%i] = test.apply(feature_change)

-----
试下这个
  1. for i in range(10):
  2.     def a():
  3.         print(i)

  4. print("1")
  5. a()
复制代码

输出的是9
相当于先把i累加到9,再print一次i
那么这个程序改成
  1. i=9
  2. print(i)
复制代码

也是一样

----

一般不会写成

for a in range(b):
    def xxx():
        ……

而是写成

def xxx():
    for a in range(b)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-10 08:20:19 | 显示全部楼层
傻纸 发表于 2019-9-9 20:56
心累了。。
for i in test.columns:
    def xxx():

我早先就试过,先def函数,再用for循环来apply。。但是仍旧报错。。问题不在于def 和for的先后顺序。。而是我发现函数中传入df格式的数据时,打印出来是series的格式。。如果传入的是series则打印出来的是单个值。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-10 09:21:25 | 显示全部楼层
老笨啊 发表于 2019-9-10 08:20
我早先就试过,先def函数,再用for循环来apply。。但是仍旧报错。。问题不在于def 和for的先后顺序。。而 ...

确实是跟for定义在哪无关
  1. for i in range(10):
  2.     def a():
  3.         print(i)
  4.     a()
复制代码

我也是学到一个新写法。。其他的我也不知道了,你自己多研究下pandas库
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-19 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表