Python 将数据帧列表中的每个数据帧附加到另一个数据帧列表中

Python 将数据帧列表中的每个数据帧附加到另一个数据帧列表中,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有两组从大数据帧分割的数据帧。比如说, 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,

我有两组从大数据帧分割的数据帧。比如说,

    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)
correlation(pc1_lnc_1)
现在,我需要将来自df1(
pc1,pc2
)的每个分割数据帧与来自df2(
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])
在每个连接的数据帧上,我需要运行一个相关分析函数,例如

    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)
correlation(pc1_lnc_1)
我想单独保存结果,例如,

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

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

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

您可以循环分割数据帧:

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

您可以在拆分的数据帧上循环:

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

如果数组中没有单独的数据帧(并且假设数据帧的数量非常多),最简单的方法(代码修改最少)是在循环中抛出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

差不多

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的标准免责声明仍然适用(不要这样做,因为它是懒惰的编程实践,不安全的输入可能会导致代码中的各种问题)

有关原因的更多详细信息,请参见此处


编辑更新问题的答案。

以下是另一个想法

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

还有一个想法

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

感谢您的回答,我想分别保存每个连接数据帧的输出。在循环的
for
中,它等待所有分割的数据帧,因此打印输出将永远花费时间。由于这个原因,我将数据帧分割成更小的帧。我已经更新了问题谢谢你的回答,我想分别保存每个连接数据帧的输出。在循环的
for
中,它等待所有分割的数据帧,因此打印输出将永远花费时间。由于这个原因,我将数据帧分割成更小的帧。我已经更新了问题谢谢你的帮助。我想单独保存输出。正如问题中提到的。我认为这是不可能的loop@zhqiat如果eval不好,为什么还要推荐它??在上述情况下,eval是多余的。@Sushanth大多数情况下eval会导致所有类型的错误,但是它被包含在语言中是有原因的(这意味着有时它是对所写问题的回答)@zhqiat,脚本中的
范围(0,n)
是什么?感谢您的帮助。我想单独保存输出。正如问题中提到的。我认为这是不可能的loop@zhqiat如果eval不好,为什么还要推荐它??在上述情况下,eval是多余的。@Sushanth大多数情况下eval会导致所有类型的错误,但是它被包含在语言中是有原因的(这意味着它有时是对所写问题的回答)@zhqiat,脚本中的
range(0,n)
是什么?输出只是打印标题。谢谢,它现在正在打印输出!我有一个问题,是否有一种方法可以并行运行每个分割数据帧,而不是一个接一个地运行?目前,在大数据框架上,打印输出要花费相当多的时间。输出只打印标题。谢谢,现在正在打印输出!我有一个问题,是否有一种方法可以并行运行每个分割数据帧,而不是一个接一个地运行?目前,在大数据框架上,打印输出需要花费相当多的时间。