读取多个CSV文件到Python Pandas数据框架中

11

这个问题背后的一般用例是从目标目录中读取多个 CSV 日志文件到一个 Python Pandas 数据帧中,以便进行快速的统计分析和图表制作。使用 Pandas 而非 MySQL 的想法是为了在全天定期进行数据导入或附加 + 统计分析。

下面的脚本尝试将所有 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

1
pieces是什么类型的对象?它是列表还是数据框? - Greg Reda
3个回答

13

在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)

谢谢@gjreda。我使用了你提供的方法1,期望的结果非常完美。 - user892627
在[3]中: # 预期行总数应为1690784名称 Out [3]: Int64Index:1690784个条目,从0到1690783 数据列: 出生 1690784个非空值 名字 1690784个非空值 性别 1690784个非空值 年份 1690784个非空值 数据类型:int64(2),object(2) - user892627

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)

示例在《Python数据分析》的第33-34页上,示例使用了pd.concat。 - scharfmn

-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)

5
在Python代码中,空白行不起任何作用。只有当你将代码粘贴到控制台或其他地方时,它才会产生影响。 - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接