将多个CSV文件读入Python Pandas Dataframe

时间:2013-04-05 20:40:03

标签: python pandas

问题背后的一般用例是将目标目录中的多个CSV日志文件读入单个Python Pandas DataFrame,以便快速进行周转统计分析。图表。利用Pandas vs MySQL的想法是在一天内定期进行数据导入或附加+ stat分析。

下面的脚本尝试将所有CSV(相同的文件布局)文件读入单个Pandas数据帧&添加与每个文件读取关联的年份列。

脚本的问题是它现在只读取目录中的最后一个文件,而不是目标目录中所有文件所需的结果。

# Assemble all of the data files into a single DataFrame & add a year field
# 2010 is the last available year
years = range(1880, 2011)

for year in years:
    path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year
    frame = pd.read_csv(path, names=columns)

    frame['year'] = year
    pieces.append(frame)

# Concatenates everything into a single Dataframe
names = pd.concat(pieces, ignore_index=True)

# Expected row total should be 1690784
names
<class 'pandas.core.frame.DataFrame'>
Int64Index: 33838 entries, 0 to 33837
Data columns:
name      33838  non-null values
sex       33838  non-null values
births    33838  non-null values
year      33838  non-null values
dtypes: int64(2), object(2)

# Start aggregating the data at the year & gender level using groupby or pivot
total_births = names.pivot_table('births', rows='year', cols='sex', aggfunc=sum)
# Prints pivot table
total_births.tail()

Out[35]:
sex     F   M
year        
2010    1759010     1898382

3 个答案:

答案 0 :(得分:12)

DataFrame实例上的append方法与列表实例上的append方法的功能不同。 Dataframe.append()不会就地发生,而是返回一个新对象。

years = range(1880, 2011)

names = pd.DataFrame()
for year in years:
    path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year
    frame = pd.read_csv(path, names=columns)

    frame['year'] = year
    names = names.append(frame, ignore_index=True)

或者您可以使用concat

years = range(1880, 2011)

names = pd.DataFrame()
for year in years:
    path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year
    frame = pd.read_csv(path, names=columns)

    frame['year'] = year
    names = pd.concat(names, frame, ignore_index=True)

答案 1 :(得分:0)

我无法获得上述任何一个工作的答案。第一个答案很接近,但for之后的第二行和第三行之间的行间距不正确。我在Canopy中使用了以下代码片段。此外,对于那些感兴趣的人......这个问题来自"Python for Data Analysis"中的一个例子。 (到目前为止,这是一本令人愉快的书)

import pandas as pd

years = range(1880,2011)
columns = ['name','sex','births']
names = pd.DataFrame()

for year in years:
    path = 'C:/PythonData/pydata-book-master/pydata-book-master/ch02/names/yob%d.txt' % year
    frame = pd.read_csv(path, names=columns)
    frame['year'] = year
    names = names.append(frame,ignore_index=True)

答案 2 :(得分:-3)

删除以下行间距:

    frame = pd.read_csv(path, names=columns)

&安培;

    frame['year'] = year

所以它读取

    for year in years:
        path ='C:\\Documents and Settings\\Foo\\My Documents\\pydata-book\\pydata-book-master`\\ch02\\names\\yob%d.txt' % year
        frame = pd.read_csv(path, names=columns)
        frame['year'] = year
        names = pd.append(names, frame, ignore_index=True)