Python 熊猫-将多个文本文件中的信息合并到单个数据帧中

Python 熊猫-将多个文本文件中的信息合并到单个数据帧中,python,pandas,dataframe,Python,Pandas,Dataframe,我有多个文本(.txt)文件保存在一个文件夹中。我正试图将它们合并到一个数据帧中。到目前为止,我已经能够将它们结合起来,但不是以我喜欢的方式 文本文件(名为yob##########txt其中####是一年)包含如下信息: Jennifer,F,58376 Amanda,F,35818 Jessica,F,33923 Melissa,F,31634 Sarah,F,25755 Heather,F,19975 Nicole,F,19917 Amy,F,19834 Elizabeth,F,19529

我有多个文本(
.txt
)文件保存在一个文件夹中。我正试图将它们合并到一个数据帧中。到目前为止,我已经能够将它们结合起来,但不是以我喜欢的方式

文本文件(名为
yob##########txt
其中
####
是一年)包含如下信息:

Jennifer,F,58376
Amanda,F,35818
Jessica,F,33923
Melissa,F,31634
Sarah,F,25755
Heather,F,19975
Nicole,F,19917
Amy,F,19834
Elizabeth,F,19529
Michelle,F,19122
Kimberly,F,18499
Angela,F,17970
我试图打开每个文件,将年份添加到行的末尾,然后继续

def main():
    files = file_paths(FILE_FOLDER) # returns a list of file paths, i.e. ["C:\Images\file.txt","C:\Images\file2.txt", ...]

    df = []
    for file in files:
        year = file.split("\\")[-1][3:7] 
        df.append(pd.read_table(file)+","+year)
    big_df = pd.concat(df, ignore_index=True, axis=1)
    big_df.to_csv("Combined.csv", header=False, index=False)
这几乎是可行的…除了它获取每个文件并将数据放在一列中,下一个文件放在第二列中,下一个文件放在第三列中,等等

电流输出:

预期的输出是相同的,除了打开1881文件时,它将信息添加到
1880
的末尾。然后
1882
跟随
1881
数据等

  • 对于
    read\u table
    ,默认分隔符假定为空白(
    sep='\t'
    )。将
    read_table
    更改为
    read_csv
    ,从而推断出您的分隔符。或者,指定
    sep=','
    以获得相同的效果
  • 您试图添加一个新列
    year
    ,但操作不正确。您可以使用
    assign
    将其添加到
  • 垂直连接(
    轴=0
    ,默认值),而不是水平连接
  • 可以使用在迭代时无缝添加列

    还请注意,使用而不是按特定字符拆分是一种很好的做法:这将确保您的代码可以在多个平台上工作

    更新:添加
    header=None
    并使用
    pd.read\u csv
    ,如其他答案所述

    dfs = []
    for file in files:
        year = os.path.basename(fn)[3:7]
        dfs.append(pd.read_csv(file, header=None).assign(Year=year))
    
    df = pd.concat(dfs, ignore_index=True, axis=1)
    
    更有效的方法是使用列表理解:

    dfs = [pd.read_csv(file, header=None).assign(Year=os.path.basename(fn)[3:7]) \
           for file in files]
    
    df = pd.concat(dfs, ignore_index=True, axis=1)
    

    您当前正在以列而不是行连接DFs,请尝试
    big\u df=pd.concat(df,ignore\u index=True,axis=0)
    instead@Ben.T-我也尝试过……正如我最初使用的一样(轴为1),它的运行时间约为4.6秒。执行
    axis=0
    将其向上推约38.9秒。将文件大小从38MB增加到293MB,并且有很多“空列”(empty columns)()确实看起来不太好…问题可能是txt文件中没有标题,然后根据定义,第一行是列的名称,并且它们年复一年都不相同。尝试执行
    pd.read_table(file,header=None)
    并仍然与
    axis=0
    @Ben.T-Aha连接!!看起来它真的做到了,减少到8.2秒~33MB:d感谢第二点,我知道我添加年份的方式不是pythonic/是笨拙的。当我尝试你的方法时,我在
    big\u df=pd.concat(df,ignore\u index=True)
    @BruceWayne看起来你有很多数据:D。。。顺便问一下,你是说“DFU列表”吗?我对代码中的变量做了一点修改,虽然有很多数据,但不是我想象不到的那么多。仅供参考,这是来自…的“国家数据库”,我很惊讶它遇到了内存错误?(谢谢,是的,我注意到变量名发生了变化。)@BruceWayne什么是
    len(df_列表)
    ?还有,什么是
    sum(map(len,df_list))
    ?@BruceWayne AHA!因为您的文本文件没有标题。发生这种情况的原因是,concat试图自动对齐concatted数据帧,从而导致NAN内存急剧膨胀。谢谢你,我会修正我的答案来反映这一点。分配不是这里唯一的问题。另一个问题是分隔符和连接的方式(参见我的答案)
    dfs = [pd.read_csv(file, header=None).assign(Year=os.path.basename(fn)[3:7]) \
           for file in files]
    
    df = pd.concat(dfs, ignore_index=True, axis=1)