【问题标题】:pipe several pandas dataframes [duplicate]管道几个熊猫数据框[重复]
【发布时间】:2019-01-11 08:59:19
【问题描述】:

我正在尝试通过管道运行多个数据帧以永久更改每个数据帧,但更改不会在 for 循环之外持续存在。有人可以告诉我这样做的正确语法吗?所有编辑都像 edit_1g() 一样分配并返回一个数据框。谢谢。

# create pipeline to preprocess the data:
def pipeline_1(df):
    df1=(df.pipe(edit_2a)
       .pipe(edit_2b)
       .pipe(edit_2d)
       .pipe(edit_2e)
       .pipe(edit_1f)
       .pipe(edit_1j)
       .pipe(edit_1g)           
       .pipe(edit_2h)
        )
    return df1

# list the data frames we want to run through our pipeline:
dfs = {'df_orders':df_orders, 'df_accts_summary':df_accts_summary, 'df_accts1':df_accts1, 
       'df_traders_summary':df_traders_summary, 'df_traders1':df_traders1,
       'df_tag76_summary':df_tag76_summary, 'df_tag761':df_tag761}

print('data frames altered via pipeline_1: \n')
for key, values in dfs.items():
    values = pipeline_1(values)       # changes aren't persisting outside of the loop
    print(key + ' ' + str(values.shape))

# round the decimals of columns:
def edit_1g(df):
    d = {'icpwp10bp':0, 'icpwp2bp':0, 'icslippagebpbp':0, 'participationrate':0, 'adv':1, 'twodprioris':0,
         'twodpostis':0, 'orderval':0, 'valuedark':0, 'mktvalflt':0, 'numberoffills': 0, 'size':0,
         'lmtadjintvwap':0, 'fivedsprd':0, 'tendvol':0
        }
    df = df.round(d)
    return df

【问题讨论】:

  • 您能否列出您的编辑功能之一的示例?他们是否获取并返回数据框?
  • 是的。我上面已经举了一个例子
  • 查看标记的重复项,values = pipeline_1(values) 只是更新变量values。它不会更新您的字典。

标签: python pandas


【解决方案1】:

我猜最后一部分有问题:

for key, values in dfs.items():
    values = pipeline_1(values)      
    print(key + ' ' + str(values.shape))

你应该在这里分配:

new_dfs = dict()
for key, values in dfs.items():
    values = pipeline_1(values)    
    new_dfs[key] = values 
    print(key + ' ' + str(values.shape))

所以,new_dfs 包含新的数据帧。但是这种方法会复制您的数据。您可以尝试就地分配:

for key, values in dfs.items():
    values = pipeline_1(values)    
    dfs[key] = values 
    print(key + ' ' + str(values.shape))

【讨论】:

  • 非常感谢。如果我做上面的 new_dfs['df_tag761'] 有预期的结果,但 df_tag761 没有,这很好,但理想情况下我想直接编辑 df_tag761
  • 这种情况下,您应该将管道中的函数(edit_1gedit_1f ...)转换为 inplace 函数(即每个函数就地修改数据帧,而不是返回它)。但 IMO 不是很清楚,最好返回并重新分配。
猜你喜欢
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多