如何使用 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_dataframe
、length_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)?