如何使用 for 循环组合多个数据帧?

Posted

技术标签:

【中文标题】如何使用 for 循环组合多个数据帧?【英文标题】:How to combine multiple dataframes using for loop? 【发布时间】:2021-10-15 12:48:52 【问题描述】:

我正在尝试合并多列,其中一列之后的以下列从特定索引开始。例如,正如您在下面的代码中看到的,我有 15 组从 df20 到 df90 的数据。如代码所示,我已合并数据 i,然后从 index = 1,000 开始合并另一个数据。

所以我希望我的输出是 df20,然后是从 index=1000 开始的 df25,然后是从 index=2000 开始的 df30,然后是 index=3000 的 df35。我想查看所有 15 列,但我的输出中只有一列。

我在下面尝试过,但似乎不起作用。请帮忙。

dframe = [df20, df25, df30, df35, df40, df45, df50, df55, df60, df65, df70, df75, df80, df85, df90]
for i in dframe:
  a = i.merge((i).set_index((i).index+1000), how='outer', left_index=True, right_index=True)

print(a)

输出:

                      df90_x              df90_y
0                     0.000757                      NaN
1                     0.001435                      NaN
2                     0.002011                      NaN
3                     0.002497                      NaN
4                     0.001723                      NaN
...                        ...                      ...
10995                      NaN             1.223000e-12
10996                      NaN             1.305000e-12
10997                      NaN             1.809000e-12
10998                      NaN             2.075000e-12
10999                      NaN             2.668000e-12

[11000 rows x 2 columns]

预期输出:

                      df20                 df25                  df30
0                     0.000757             0                     0
1                     0.001435             0                     0
2                     0.002011             0                     0
3                     0.002497             0                     0
4                     0.001723             0                     0
...                  ...                   ...                   ...
1000                                      1.223000e-12           0
1001                                      1.305000e-12           0
1002                                      1.809000e-12           0
1003                                      2.668000e-12           0
...                                                              ...
2000                                                             0.1234
2001                                                             0.4567
2002                                                             0.8901
2003                                                             0.2345

【问题讨论】:

这就是merge 应该做的事情。试试pd.concat(dframe, axis=1) 您希望输出是什么?为什么输出错误?解释这一点将有助于回答我对您的数据格式的许多问题。 @MarijnvanVliet 所以我希望我的输出是 df20,然后是从 index=1000 开始的 df25,然后是从 index=2000 开始的 df30,然后是 index=3000 的 df35。 @ThePyGuy 我想尝试将我的输出设为 df20,然后是从 index=1000 开始的 df25,然后是从 index=2000 开始的 df30,然后是 index=3000 的 df35。跨度> 如果只是你关心的索引,可以使用pd.concat。从数据框中发布一个小样本,并为样本数据添加预期输出。请看How to ask和How to make good pandas example 【参考方案1】:

如果你想要num_dataframelength_dataframe 的变量,你可以试试这个代码:

import pandas as pd
import random

dframe = list()
num_dataframe = 3
len_dataframe = 5

for i in range((num_dataframe)):
    dframe.append(pd.DataFrame(i:[random.randrange(1, 50, 1) for i in range(len_dataframe)],
                               index=range(i*len_dataframe, (i+1)*len_dataframe)))


result = pd.concat([dframe[i] for i in range(num_dataframe)], axis=1)

result.fillna(0)

输出:

对于你的问题,你想要 20 个长度为 1000 的数据框,你可以试试这个:

import pandas as pd
import random

dframe = list()
num_dataframe = 20
len_dataframe = 1000

for i in range((num_dataframe)):
    dframe.append(pd.DataFrame(i:[np.random.random() for i in range(len_dataframe)],
                               index=range(i*len_dataframe, (i+1)*len_dataframe)))


result = pd.concat([dframe[i] for i in range(num_dataframe)], axis=1)

result.fillna(0)

输出:

正如您在评论中提到的,我编辑帖子并添加以下代码:

dframe = [df20, df25, df30, df35, df40, df45, df50, df55, df60, df65, df70, df75, df80, df85, df90]

result = pd.concat([dframe[i] for i in range(len(dframe))], axis=0)

result.fillna(0)

【讨论】:

那么我该如何准确地输入我的数据框呢?我看到那些只是随机数。你能告诉我这部分吗? @KimYejun,我会根据您的要求编辑帖子并添加代码,也许这会对您有所帮助。 我已经尝试过您的代码,但未显示数据框中的数据。一切都只是零:( @KimYejun,我发了三个代码块,你跑的是哪个代码块? 是的,我确实运行了所有内容。第一个代码是我希望输出的代码。但是我的值是随机的。所以你给了我第三个代码,它给了我从 df20 到 df90 的数据帧的值,但是当我运行它时,它只显示零而不是我的数据帧中的实际值:( 对不起,也许我是只是真的不擅长编码【参考方案2】:

请参考official page。


连接多个数据帧

df1=pd.DataFrame(
        
            "A":["A0","A1","A2","A3"]
        ,
        index=[0, 1, 2, 3]
)
df2=pd.DataFrame(
        
            "B":["B4","B5"]
        ,
        index=[4, 5]
)
df3=pd.DataFrame(
        
            "C":["C6", "C7", "C8", "C9", "C10"]
        ,
        index=[6, 7, 8, 9, 10]
)
result = pd.concat([df1, df2, df3], axis=1)
display(result)

输出:

      A    B    C
0    A0  NaN  NaN
1    A1  NaN  NaN
2    A2  NaN  NaN
3    A3  NaN  NaN
4   NaN   B4  NaN
5   NaN   B5  NaN
6   NaN  NaN   C6
7   NaN  NaN   C7
8   NaN  NaN   C8
9   NaN  NaN   C9
10  NaN  NaN  C10

通过循环将文件导入列表

方法一: 您可以创建一个列表以将整个文件名放入列表中

filenames = ['sample_20.csv', 'sample_25.csv', 'sample_30.csv', ...]
dataframes = [pd.read_csv(f) for f in filenames]

方法1-1: 如果您确实有很多文件,那么您需要一种更快的方法来创建名称列表

filenames = ['sample_.csv'.format(i) for i in range(20, 90, 5)]
dataframes = [pd.read_csv(f) for f in filenames]

方法二:

from glob import glob
filenames = glob('sample*.csv')
dataframes = [pd.read_csv(f) for f in filenames]

【讨论】:

非常感谢您的回答。实际上我已经以类似的方式尝试过,但是我有很多数据帧,大约有一千个或更多要连接,所以我试图弄清楚如何使用 for 循环函数来代替。 我更新了关于数据帧列表循环的帖子 也许你需要用这种方式分别排列索引,确保不会有任何重叠的索引,然后做“concat整体”的过程 对不起,你能告诉我列表循环吗? 将循环文件更新为列表,在此步骤之后,您可能需要处理dataframes列表中每个数据帧中的索引

以上是关于如何使用 for 循环组合多个数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据

如何使用for循环或条件在pandas数据框的子集中创建多个回归模型(statsmodel)?

将通过 FOR 循环函数输出的多个数据帧合并为一个数据帧

使用 for 循环创建多个数据帧

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

如何使用循环将多个条件应用于数据帧