10

質問の背後にある一般的な使用例は、複数の CSV ログ ファイルをターゲット ディレクトリから単一の Python Pandas DataFrame に読み取って、迅速なターンアラウンドの統計分析とチャート作成を行うことです。Pandas と MySQL を利用するためのアイデアは、このデータ インポートまたは追加 + 統計分析を 1 日を通して定期的に実行することです。

以下のスクリプトは、すべての 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
4

3 に答える 3

13

appendDataFrame のインスタンスのメソッドは、リストのインスタンスのメソッドと同じようには機能しませんappendDataframe.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)
于 2013-04-05T21:30:46.083 に答える
0

上記の答えのいずれかを機能させることができませんでした。最初の回答は近いのですが、その後の 2 行目と 3 行目の行間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)
于 2013-08-05T01:08:47.003 に答える
-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)
于 2014-02-09T20:16:46.483 に答える