首页 > 解决方案 > 将python列表中的数据合并到一个数据框中

问题描述

我在名为 AMEX 的文件夹中的 AAMC_K.txt、AAU.txt、ACU.txt、ACY.txt 中有以下文件。我正在尝试将这些文本文件合并到一个数据框中。我曾尝试使用 pd.merge() 这样做,但我收到一个错误,即合并函数需要一个左右参数,而我的数据位于 python 列表中。如何将 data_list 中的数据合并到一个 pandas 数据框中。

import pandas as pd
import os

textfile_names = os.listdir("AMEX")
textfile_names.sort()
data_list = []

for i in range(len(textfile_names)):
   data = pd.read_csv("AMEX/"+textfile_names[i], index_col=None, header=0)
   data_list.append(data)

frame = pd.merge(data_list, on='<DTYYYYMMDD>', how='outer')

"AE.txt"
<TICKER>,<PER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>
AE,D,19970102,000000,12.6250,12.6250,11.7500,11.7500,144,0
AE,D,19970103,000000,11.8750,12.1250,11.8750,12.1250,25,0

AAU.txt
<TICKER>,<PER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>
AAU,D,20020513,000000,0.4220,0.4220,0.4220,0.4220,0,0
AAU,D,20020514,000000,0.4177,0.4177,0.4177,0.4177,0,0

ACU.txt
<TICKER>,<PER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>
ACU,D,19970102,000000,5.2500,5.3750,5.1250,5.1250,52,0
ACU,D,19970103,000000,5.1250,5.2500,5.0625,5.2500,12,0

ACY.txt
<TICKER>,<PER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>
ACY,D,19980116,000000,9.7500,9.7500,8.8125,8.8125,289,0
ACY,D,19980120,000000,8.7500,8.7500,8.1250,8.1250,151,0

我希望使用 DTYYYYMMDD 过滤输出并放入一个数据帧帧中。

OUTPUT
<TICKER>,<PER>,<DTYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>,<TICKER>,<PER>,<DTYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>,<OPENINT>
ACU,D,19970102,000000,5.2500,5.3750,5.1250,5.1250,52,0,AE,D,19970102,000000,12.6250,12.6250,11.7500,11.7500,144,0
ACU,D,19970103,000000,5.1250,5.2500,5.0625,5.2500,12,0,AE,D,19970103,000000,11.8750,12.1250,11.8750,12.1250,25,0

标签: pythonpandas

解决方案


正如@busybear 所说,pd.concat是完成这项工作的正确工具:frame = pd.concat(data_list).

merge适用于当您加入两个通常具有一些相同列和一些不同列的数据框时。您选择一个列(或索引或​​多个)来标识两个数据帧中的哪些行彼此对应,并pandas处理制作一个数据帧,其行是两个原始数据帧中相应行的组合。此功能一次仅适用于 2 个数据帧;你必须做一个循环来合并更多(需要以这种方式合并许多数据帧是不常见的)。

concat适用于当您有多个数据框并且只想将其所有行或列附加到一个大数据框时。(假设您正在连接行,如您所愿。)它不使用标识符来确定哪些行对应。它所做的只是创建一个新的数据框,其中包含来自每个concated 数据框的每一行(第一个中的所有行,然后是第二个中的所有行,等等)。

merge我认为以上是关于vs的一个不错的 TLDR,concat但请参阅此处merge以获取有关使用//join与数据帧的冗长但更全面的指南concat


推荐阅读