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)