【问题标题】:Appending the each dataframe from a list of dataframe with another list of dataframes将数据框列表中的每个数据框附加到另一个数据框列表中
【发布时间】:2020-07-27 22:45:30
【问题描述】:

我有 2 组来自大数据框的拆分数据框。比如说,

    import pandas as pd, numpy as np

   np.random.seed([3,1415])
ind1 = ['A_p','B_p','C_p','D_p','E_p','F_p','N_p','M_p','O_p','Q_p']
col1 = ['sap1','luf','tur','sul','sul2','bmw','aud']
df1  = pd.DataFrame(np.random.randint(10, size=(10, 7)), columns=col1,index=ind1)
ind2 = ['G_l','I_l','J_l','K_l','L_l','M_l','R_l','N_l']
col2 = ['sap1','luf','tur','sul','sul2','bmw','aud']
df2  = pd.DataFrame(np.random.randint(20, size=(8, 7)), columns=col2,index=ind2)

# Split the dataframes into two parts 
pc_1,pc_2   = np.array_split(df1, 2)
lnc_1,lnc_2 = np.array_split(df2, 2)

现在,我需要将来自 df1 (pc1, pc2) 的每个拆分数据帧与来自 d​​f2 (ln_1,lnc_2) 的每个数据帧连接起来。目前,我正在这样做,

# concatenate each split data frame pc1 with lnc1

pc1_lnc_1 =pd.concat([pc_1,lnc_1])
pc1_lnc_2 =pd.concat([pc_1,lnc_2])
pc2_lnc1  =pd.concat([pc_2,lnc_1])
pc2_lnc2  =pd.concat([pc_2,lnc_2])

在每个连接的数据帧上,我需要运行一个相关性分析函数,例如,

correlation(pc1_lnc_1)

我想单独保存结果,例如,

  pc1_lnc1=   correlation(pc1_lnc_1)
  pc1_lnc2=   correlation(pc1_lnc_2)
     ......

  pc1_lnc1.to_csv(output,sep='\t')

问题是是否有一种方法可以使上述连接部分自动化,而不是使用某种循环在每一行中对其进行编码,目前对于每个连接的数据帧。我正在单独运行函数correlation。而且我有一个很长的拆分数据框列表。

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    您可以遍历拆分的数据帧:

    for pc in np.array_split(df1, 2):
        for lnc in np.array_split(df2, 2):
             print(correlation(pd.concat([pc,lnc])))
    

    【讨论】:

    • 感谢您的回答,我想分别保存每个连接数据帧的输出。在for loop 中,它等待所有拆分的数据帧,因此打印输出需要很长时间。由于这个原因,我将数据帧拆分为更小的数据帧。我已经更新了问题
    【解决方案2】:

    这是另一个想法,

    def correlation(data):
        # do some complex operation..
        return data
    
    # {"pc_1" : split_1, "pc_2" : split_2}
    pc = {f"pc_{i + 1}": v for i, v in enumerate(np.array_split(df1, 2))}
    lc = {f"lc_{i + 1}": v for i, v in enumerate(np.array_split(df2, 2))}
    
    for pc_k, pc_v in pc.items():
        for lc_k, lc_v in lc.items():
            # (pc_1, lc_1), (pc_1, lc_2) ..
            correlation(pd.concat([pc_v, lc_v])). \
                to_csv(f"{pc_k}_{lc_k}.csv", sep="\t", index=False)
    
    # will create csv like pc_1_lc_1.csv, pc_1_lc_2.csv.. in the current working dir
    

    【讨论】:

    • 输出只打印标题。
    • 谢谢,现在正在打印输出!
    • 我有一个问题,有没有办法并行运行每个拆分数据帧,而不是一个接一个?目前,在大数据帧上,打印输出需要相当长的时间。
    【解决方案3】:

    如果您的数组中没有单独的数据帧(并假设您有大量数据帧),最简单的方法(只需最少的代码修改)就是在循环中抛出一个 eval。

    类似

    for counter in range(0,n):
        for counter2 in range(0:n);
            exec("pc{}_lnc{}=correlation(pd.concat([pc_{},lnc_{}]))".format(counter,counter2,counter,counter2))
    
            eval("pc{}_lnc{}.to_csv(filename,sep='\t')".format(counter,counter2)
    

    关于 eval 的标准免责声明仍然适用(不要这样做,因为它是一种懒惰的编程习惯,不安全的输入可能会导致代码中出现各种问题)。

    请参阅此处了解有关eval is bad 原因的更多详细信息

    编辑更新问题的答案。

    【讨论】:

    • 感谢您的帮助。我想单独保存输出。正如问题中提到的那样。我认为这个循环是不可能的
    • @zhqiat 如果 eval 不好,为什么还要推荐它?在上述情况下 eval 是多余的。
    • @Sushanth 大多数时候 eval 会导致所有类型的错误,但是它包含在语言中是有原因的(意味着有时它是书面问题的答案)
    • @zhqiat,脚本中的range(0,n)是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 2020-10-27
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多