Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将导入文件的文件名添加到dataframe_Python_Pandas - Fatal编程技术网

Python 将导入文件的文件名添加到dataframe

Python 将导入文件的文件名添加到dataframe,python,pandas,Python,Pandas,对Python来说还是很陌生的,所以请耐心等待。我有一个文件目录,所有文件都有类似的命名方案。文件名如下所示: yob2004.txt yob2005.txt 我试图做的是打开这些文件中的每一个并将其添加到数据帧中。然后我想从文件名中提取年份,并将其作为新列添加到数据框中 我可以得到它的一部分,但不是全部 下面是从文件名中提取年份的代码 filenames = glob.glob('names/*.txt') #split off the beginning of of he file pat

对Python来说还是很陌生的,所以请耐心等待。我有一个文件目录,所有文件都有类似的命名方案。文件名如下所示:

yob2004.txt yob2005.txt

我试图做的是打开这些文件中的每一个并将其添加到数据帧中。然后我想从文件名中提取年份,并将其作为新列添加到数据框中

我可以得到它的一部分,但不是全部

下面是从文件名中提取年份的代码

filenames = glob.glob('names/*.txt')

#split off the beginning of of he file path plus 'yob' and only keep 
everything after that. ex. 1180.txt
split1 = [i.split('\yob', 1)[1] for i in filenames]

#split of the .txt from the strings in the list above
split2 = [i.split('.', 1)[0] for i in split1]
下面是将所有文件连接在一起的代码

read_files = glob.glob("names/*.txt")

with open("allnames.txt", "wb") as outfile:
    for f in read_files:
        with open(f, "rb") as infile:
            outfile.write(infile.read())
我在想,我实际上需要做的是将第一个文件读入数据框,然后从文件名中提取年份,并将其写入数据框中的一个新列。然后转到下一个文件。冲洗重复一遍


有什么指导吗?

这应该适用于您的数据,假设我有两个文件yob2004.txt和yob2005.txt:

#yob2004
1,2,3,4
2,3,4,5
5,6,7,8

#yob2005
8,9,10,11
a,b,c,d
f,j,k
i,j,k,l
我们看到这些文件具有不同的数据类型和不同的行/列数,因此将涵盖大多数边缘情况:

import pandas as pd
from os import walk

f = []
for (dirpath, dirnames, filenames) in walk('/home/dkennetz/yobDf'):
    for x in filenames:
        if x.startswith('yob'):
            f.append(x)
#f = ['yob2005.txt', 'yob2004.txt'] created a list from filenames in directory ^^^

data = pd.DataFrame() # initialize empty df
for filename in f:
    df = pd.read_csv(filename, names=['col1', 'col2', 'col3', 'col4']) # read in each csv to df
    df['filename'] = filename # add a column with the filename
    data = data.append(df) # add all small df's to big df 

data['filename'] = data['filename'].map(lambda x: x.lstrip('yob').rstrip('.txt')) # get rid of yob and .txt and just keep year
print(data)
输出:

  col1 col2 col3 col4 filename
0    8    9   10   11     2005
1    a    b    c    d     2005
2    f    j    k  NaN     2005
3    i    j    k    l     2005
0    1    2    3    4     2004
1    2    3    4    5     2004
2    5    6    7    8     2004

输出将通过将年份放在列旁边以及dfs大小不同的NAN来判断它来自哪个文件。

这应该适用于您的数据,假设我有两个文件yob2004.txt和yob2005.txt:

#yob2004
1,2,3,4
2,3,4,5
5,6,7,8

#yob2005
8,9,10,11
a,b,c,d
f,j,k
i,j,k,l
我们看到这些文件具有不同的数据类型和不同的行/列数,因此将涵盖大多数边缘情况:

import pandas as pd
from os import walk

f = []
for (dirpath, dirnames, filenames) in walk('/home/dkennetz/yobDf'):
    for x in filenames:
        if x.startswith('yob'):
            f.append(x)
#f = ['yob2005.txt', 'yob2004.txt'] created a list from filenames in directory ^^^

data = pd.DataFrame() # initialize empty df
for filename in f:
    df = pd.read_csv(filename, names=['col1', 'col2', 'col3', 'col4']) # read in each csv to df
    df['filename'] = filename # add a column with the filename
    data = data.append(df) # add all small df's to big df 

data['filename'] = data['filename'].map(lambda x: x.lstrip('yob').rstrip('.txt')) # get rid of yob and .txt and just keep year
print(data)
输出:

  col1 col2 col3 col4 filename
0    8    9   10   11     2005
1    a    b    c    d     2005
2    f    j    k  NaN     2005
3    i    j    k    l     2005
0    1    2    3    4     2004
1    2    3    4    5     2004
2    5    6    7    8     2004

输出将通过将年份放在列旁边和NAN的dfs大小不同的位置来判断它来自哪个文件。

文件的内容是什么样的?如果它是多行的,那么您必须将年份添加到与文件内容对应的每一行中。看起来像这样:Mary,F,7065这回答了你的问题吗?文件的内容是什么样的?如果它是多行的,那么您必须将年份添加到与文件内容对应的每一行中。看起来是这样的:玛丽,F,7065这回答了你的问题吗?