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

时间:2018-05-11 18:42:02

标签: 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
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)

这几乎可以工作......除了它需要每个文件并将数据放在一列中,第二列中的下一个文件,第三列中的下一个文件等等。

当前输出: enter image description here

预期输出相同,除非打开1881文件,它会将信息添加到1880的末尾。然后1882会追踪1881数据等等。

2 个答案:

答案 0 :(得分:4)

  1. 使用read_table时,默认的分隔符将被假定为空格(sep='\t')。将read_table更改为read_csv,即可推断您的分隔符。或者,指定sep=','以获得相同的效果。
  2. 您正在尝试添加新列year,但您没有正确执行此操作。您可以使用assign将其添加到
  3. 垂直连接(axis=0,默认设置),而不是水平连接。
  4. df_list = []
    for file in files:
        year = ...
        df_list.append(pd.read_csv(file, header=None).assign(year=year))
    
    big_df = pd.concat(df_list, ignore_index=True)
    big_df.to_csv("Combined.csv", header=False, index=False)
    

答案 1 :(得分:0)

您可以在迭代时使用pd.DataFrame.assign无缝添加列。

另请注意,最好使用os.path.basename而不是按特定字符拆分:这将确保您的代码可以在多个平台上运行。

已更新:添加header=None并使用pd.read_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)