原因
Spyderの設定でワークスペースを変えるとこうなる
対処
パスを通せば良い
path = '++++\名前\' df = pd.read_csv(path + "dataset.csv",header = None)
パスを移動させても良い
csv_data = pd.read_csv('./path/dataset.csv')
PythonのPandasを使っていると,例えば同じ名前の者同士を一括りにして,平均なり最大値を出したり,という処理を迫られることがあります.私自身,この間それを迫られた訳で,オライリーの本を読んで,どういう挙動を示すか色々試してみました.せっかくなので試した内容を,この記事にメモしておきたいと思います.
さて,今回のデータフレームは下のものを使います.
In [62]: df = pd.DataFrame( ...: {'Time': ['10:00:00', '10:00:01', '10:00:02', '10:00:03', '10:00:04','10:00:05', '10:00:06', '10:00:07', '10:00:08', '10:00:09'], ...: 'Sensor': ['T-A', 'T-B', 'T-C', 'T-B', 'T-C', 'T-A', 'T-C', 'T-B' ,'T-B' ,'T-C'], ...: 'Value': [25, 30, 104, 52, 41, 91, 102, 40 ,101 ,97]} ...: ) # 今回使用するデータ In [63]: df Out[63]: Sensor Time Value 0 T-A 10:00:00 25 1 T-B 10:00:01 30 2 T-C 10:00:02 104 3 T-B 10:00:03 52 4 T-C 10:00:04 41 5 T-A 10:00:05 91 6 T-C 10:00:06 102 7 T-B 10:00:07 40 8 T-B 10:00:08 101 9 T-C 10:00:09 97
実験か何かでセンサ類を使って,得られたデータを分析することを想定しています.それぞれ,
を示しています.ちょっと問題設定としては苦しいかもしれませんが,練習のためと思ってご了承ください.
センサの型番で括るとこんな感じです.
# 今回使用するデータ In [63]: df Out[63]: Sensor Time Value 0 T-A 10:00:00 25 1 T-B 10:00:01 30 2 T-C 10:00:02 104 3 T-B 10:00:03 52 4 T-C 10:00:04 41 5 T-A 10:00:05 91 6 T-C 10:00:06 102 7 T-B 10:00:07 40 8 T-B 10:00:08 101 9 T-C 10:00:09 97 # 'Sensor'で括る In [101]: df.groupby('Sensor').groups Out[101]: {'T-A': Int64Index([0, 5], dtype='int64'), 'T-B': Int64Index([1, 3, 7, 8], dtype='int64'), 'T-C': Int64Index([2, 4, 6, 9], dtype='int64')}
括った塊を演算にかけることが出来ます.例えば下の場合は'Sensor'でグルーピングして平均を求めています.
# 'Sensor'で括り,'T-A''T-B''T-C'のそれぞれの'Value'に対する平均値を求める In [66]: df_mean = df.groupby('Sensor')['Value'].mean() In [67]: df_mean Out[67]: Sensor T-A 58.00 T-B 55.75 T-C 86.00 Name: Value, dtype: float64
In [63]: df Out[63]: Sensor Time Value 0 T-A 10:00:00 25 1 T-B 10:00:01 30 2 T-C 10:00:02 104 3 T-B 10:00:03 52 4 T-C 10:00:04 41 5 T-A 10:00:05 91 6 T-C 10:00:06 102 7 T-B 10:00:07 40 8 T-B 10:00:08 101 9 T-C 10:00:09 97
ここで無理やりTime列をDateTime 型に変換して列を追加します
In [93]: df2 = df.assign(time2=lambda xx: pd.to_datetime(xx.Time)) In [94]: df2 Out[94]: Sensor Time Value time2 0 T-A 10:00:00 25 2017-02-05 10:00:00 1 T-B 10:00:01 30 2017-02-05 10:00:01 2 T-C 10:00:02 104 2017-02-05 10:00:02 3 T-B 10:00:03 52 2017-02-05 10:00:03 4 T-C 10:00:04 41 2017-02-05 10:00:04 5 T-A 10:00:05 91 2017-02-05 10:00:05 6 T-C 10:00:06 102 2017-02-05 10:00:06 7 T-B 10:00:07 40 2017-02-05 10:00:07 8 T-B 10:00:08 101 2017-02-05 10:00:08 9 T-C 10:00:09 97 2017-02-05 10:00:09
あとは無理やり
In [95]: df2.groupby(pd.Grouper(key='time2', freq='2s')).groups Out[95]: {Timestamp('2017-02-05 10:00:00', freq='2S'): 2, Timestamp('2017-02-05 10:00:02', freq='2S'): 4, Timestamp('2017-02-05 10:00:04', freq='2S'): 6, Timestamp('2017-02-05 10:00:06', freq='2S'): 8, Timestamp('2017-02-05 10:00:08', freq='2S'): 10}
In [96]: df2.groupby(pd.Grouper(key='time2', freq='2s')).max() Out[96]: Sensor Time Value time2 2017-02-05 10:00:00 T-B 10:00:01 30 2017-02-05 10:00:02 T-C 10:00:03 104 2017-02-05 10:00:04 T-C 10:00:05 91 2017-02-05 10:00:06 T-C 10:00:07 102 2017-02-05 10:00:08 T-C 10:00:09 101
Jupyter Notebookって何かとトラブる気がします.
この記事を最初に書いたのは17年の冬ですが,その後違う原因のトラブルに見舞われたので,その時の対処方法をメモしておきます.
Jupyter Notebookが立ち上がらない,起動せずに一瞬だけ下のようなコンソール画面が出てすぐに閉じてしまうという現象がありました.よくみると「No such file or directory: ~~」って言ってます.
ちなみにこれは一瞬すぎるので撮影するのにちょっと苦労しました.
パスの値がおかしいからです.
Jupyter Notebookのショートカットを右クリックしてファイルの場所を開く
ショートカットを右クリックして,「リンク先」の一番後ろにある%HOME%を消す
Jupyter Notebookを起動すると同じく一瞬だけ「No such file or directory: ~~」と出ます.さっきと違うのは,後ろに変な値が無いことです.
一瞬すぎるので,コマンドプロンプトから直接Jupyterを呼び出します.
そうすると「No such notebook dir: ~~」と出力されます.
ディレクトリの場所を変更すると起きます
「No such notebook dir: ~~」以下の「~~」の箇所で指定されているディレクトリに下記のように設定ファイル群探して移動させておきました.
ウィルスバスターが原因でJupyter Notebookが起動しないこともあるらしいです.
teratail.com
In [11]: import pandas as pd In [12]: import numpy as np In [13]: df = pd.DataFrame(np.array([[1,1,1,1],[1,'A',1,'B'],[1,'A',1,'B'],[1,1,1,'B']]), columns=['C1','C2','C3','C4']) In [14]: df[df['C2']=='A'][['C2','C4']] Out[14]: C2 C4 1 A B 2 A B
日本語の入ったCSVファイルの読み込み方を試行錯誤したので,結果を記しておきました
こんな日本語の入ったCSVファイルを用意します
# testJP.csv "福岡",1,2 "博多",3,4 "長崎",5,6
こうすれば出来ました
import codecs as cd import pandas as pd with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file: df = pd.read_table(file,header=None,sep=',') print(df)
と書くと・・
0 1 2 0 福岡 1 2 1 博多 3 4 2 長崎 5 6
import pandas as pd df = pd.read_csv('testJP.csv')
と書くと...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 0: invalid start byte
読み込めませんでした,,,
import codecs as cd import pandas as pd with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file: df = pd.read_table(file,header=None) print(df)
と書くと・・・
福岡,1,2 0 博多,3,4 1 長崎,5,6
ただこれは見ての通り,カンマで区切られてないみたいなんですね~
import codecs as cd import pandas as pd with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file: df = pd.read_table(file,header=None) print(df)
と書くと・・・
0 0 福岡,1,2 1 博多,3,4 2 長崎,5,6
おぉ,,
無理やり区切る
import codecs as cd import pandas as pd with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file: df = pd.read_table(file,header=None,sep=',') print(df)
と書くと・・
0 1 2 0 福岡 1 2 1 博多 3 4 2 長崎 5 6
下記も参考に
publicjournal.hatenablog.com
久しぶりにPythonで機械学習的なことをやってみました.今回は教師なし学習としてクラスター分析のソースコードを書いてみて色々試しました.
こんな感じで書いてみました.
上のソースコードはファイル出力とか省いていますが,省かないで実際に使ったデータセットなども含めた版はこちらです.(自分用)
次のような明らかに3分割されたデータを使って,3つのクラスターに分けてみました.
クラスターに分類た結果は次のとおりです.それぞれのクラスターに,赤,青,緑で色を付けています.
まぁ,これは簡単だから出来て当たり前ですね.
次に,こんな風に円状の塊のそとにデータ群が囲っている状況を考えます.これを2つのクラスターに分けるとどうなるのでしょうか?
下が,分けた結果です.真ん中と外で別れるものかと思ったらそうではないですね.
実はこの円形のデータセットは,ネットでKmeans法を調べると例題としてよく乗っているやつです.なんでもカーネル法を使うと上手く分けられるそうな.また後日試してみます.
検索してすぐ出てきたやつを参考にしました
Pandasを用いたCSVファイルの入出力について色々試してみました.下の英語ドキュメントに詳しく書いてあるんですが,自分がよく使うものだけピックアップしてメモしておきます.
テスト用にこんなCSVファイルを用意します
text1.csv ↓
hakata@hukuoka+900,100,1981 kitakyuushuu@hukuoka+900,200,1954 iiduka@hukuoka+900,300,1971
もくじ
とくに何も引数を指定しない場合は,一行目がheaderになるようです
In [1]: import pandas as pd df = pd.read_csv('text1.csv') # データフレームを作る In [2]: df Out[2]: hakata@hukuoka+900 100 1981 0 kitakyuushuu@hukuoka+900 200 1954 1 iiduka@hukuoka+900 300 1971
引数に,header=Noneを指定すればいけます.
In [3]: df = pd.read_csv('text1.csv',header=None) In [4]: df Out[4]: 0 1 2 0 hakata@hukuoka+900 100 1981 1 kitakyuushuu@hukuoka+900 200 1954 2 iiduka@hukuoka+900 300 1971
In [5]: df = pd.read_csv('text1.csv' ,names=('c1','c2','c3')) In [6]: df Out[6]: c1 c2 c3 0 hakata@hukuoka+900 100 1981 1 kitakyuushuu@hukuoka+900 200 1954 2 iiduka@hukuoka+900 300 1971
たとえば"@"区切る場合はsepを使う
In [7]: df = pd.read_csv('text1.csv', header=None,sep='@') In [8]: df Out[8]: 0 1 0 hakata hukuoka+900,100,1981 1 kitakyuushuu hukuoka+900,200,1954 2 iiduka hukuoka+900,300,1971
"@"でも"+"でもカンマでも区切りたい場合はsep='[@+,]'みたいに書く
In [9]: df = pd.read_csv('text1.csv', header=None,sep='[@+,]') In [10]: df Out[10]: 0 1 2 3 4 0 hakata hukuoka 900 100 1981 1 kitakyuushuu hukuoka 900 200 1954 2 iiduka hukuoka 900 300 1971
index_col=[指定したい行]で指定するそうです.
In [11]: df = pd.read_csv('text1.csv', index_col=[0]) In [12]: df Out[12]: 100 1981 hakata@hukuoka+900 kitakyuushuu@hukuoka+900 200 1954 iiduka@hukuoka+900 300 1971
import pandas as pd # 置き換え def sub(x): y = x.replace('@', '').replace('+900', ' ') return (y) # convertersに渡す conv = { 0: sub, # データフレーム0列目に対してsub関数を呼び出す 1: sub, # データフレーム1列目に対してsub関数を呼び出す } # データ読み込み df = pd.read_csv('testCSV1.csv', header=None,converters=conv) # 出力 print(df)
と書くと
0 1 2 0 hakatahukuoka 100 1981 1 kitakyuushuuhukuoka 200 1954 2 iidukahukuoka 300 1971
と出力される