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
Python 3.x:日本語の入ったCSVファイルを読み込んで,データフレームに格納する
日本語の入った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
読み込めませんでした,,,
cdを使うと??
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でK-means法を試してみた
久しぶりにPythonで機械学習的なことをやってみました.今回は教師なし学習としてクラスター分析のソースコードを書いてみて色々試しました.
ソースコード
こんな感じで書いてみました.
上のソースコードはファイル出力とか省いていますが,省かないで実際に使ったデータセットなども含めた版はこちらです.(自分用)
実際にやってみる
次のような明らかに3分割されたデータを使って,3つのクラスターに分けてみました.
クラスターに分類た結果は次のとおりです.それぞれのクラスターに,赤,青,緑で色を付けています.
まぁ,これは簡単だから出来て当たり前ですね.
こんなデータはどうだろうか?
次に,こんな風に円状の塊のそとにデータ群が囲っている状況を考えます.これを2つのクラスターに分けるとどうなるのでしょうか?
下が,分けた結果です.真ん中と外で別れるものかと思ったらそうではないですね.
実はこの円形のデータセットは,ネットでKmeans法を調べると例題としてよく乗っているやつです.なんでもカーネル法を使うと上手く分けられるそうな.また後日試してみます.
参考
検索してすぐ出てきたやつを参考にしました
Python3:CSVファイルの入出力について色々
Pandasを用いたCSVファイルの入出力について色々試してみました.下の英語ドキュメントに詳しく書いてあるんですが,自分がよく使うものだけピックアップしてメモしておきます.
テスト用にこんなCSVファイルを用意します
text1.csv ↓
hakata@hukuoka+900,100,1981 kitakyuushuu@hukuoka+900,200,1954 iiduka@hukuoka+900,300,1971
もくじ
1.読み込み編
ⅰ.普通に読み込んだ場合は一行目がheaderになる
とくに何も引数を指定しない場合は,一行目が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を無しを指定すると適当な数が埋め込まれる
引数に,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
ⅲ.headerやindexに名前をつけたい場合namesなどを使う
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にしたいとき
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
ⅵ.convertersを用いて特定の列だけ置き換える
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
と出力される
2.書き込み編
Python3,Pandas:データフレーム検索色々
Pandasのデータフレームに格納されたデータの検索方法についていろいろ調べたり,試行錯誤したり,結局わからなかったので教えてもらいました.忘れないようにこの記事にメモしておきます.
この記事内では,共通して下記のデータフレームを用います
In [1]: import pandas as pd In [2]: df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['01-01','01-02','01-03'], columns=['C1', 'C2', 'C3']) In [3]: df Out[3]: C1 C2 C3 01-01 1 2 3 01-02 4 5 6 01-03 7 8 9
1.データフレーム中のある要素が,どこの列名,どこの行名に所属するのかを出力する
まずは,Pandasのデータフレーム中のある要素が,どこの列名,どこの行名に所属するのかを獲得する方法について紹介します.
例えば,先程のデータフレームの中から要素の"3"が01-01の行,C3の列に所属する,というのを出力します.
Step.1 Multi-index化
まずは.stack() を使って先程のデータフレームをMulti-indexにします..stack()の解説は下記の通り
In [4]: s_df = df.stack() In [5]: s_df Out[5]: 01-01 C1 1 C2 2 C3 3 01-02 C1 4 C2 5 C3 6 01-03 C1 7 C2 8 C3 9 dtype: int64
Step.2 タプルから取り出し
"3"が入っているindexを取り出します.タプル形式で格納されるので,要素ごとに取り出せばOK.
In [6]: name = list(s_df[s_df == 3].index) In [7]: name[0][0] #index Out[7]: '01-01' In [8]: name[0][1] #column Out[8]: 'C3'
一発で出せるメソッドは無いんですかね??
2.Pandasのデータフレームにある値が有るか無いかを検索する
この場合は検索というより判定というのかもしれません.
データフレームに「1」と「10」がそれぞれあるのか無いのかを判定します.
In [9]: 1 in df.values Out[9]: True In [10]: 10 in df.values Out[10]: False
さいごに
ここら辺の話は何故か検索しても出てきませんでした...
教えていただきありがとうございました!
SourceTreeでPullのエラーが出たときの対処について
SourceTree (Ver 1.9.9.20)を使っていたら色々エラーが出たので,メモしておきます.
症状
こんな感じのエラーが出る
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags origin master:master
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/+++/++++++.git/'Pushing to https://github.com/++++/+++++++.git
対処
これはただパスワードの設定をミスっているだけ
ツール->オプション->認証からGitHub設定する
特定の行に特定の値を代入できるか試してみる:Python3
すごい初歩的なんですが,行を指定して代入できるか試してみました.
In [22]: import numpy as np In [26]: m = np.empty((4,3)) In [27]: m Out[27]: array([[ 0., 0., 0.], [ 1., 2., 3.], [ 0., 0., 0.], [ 0., 0., 0.]]) In [28]: m[1,:] = np.array([3,3,3]) In [29]: m Out[29]: array([[ 0., 0., 0.], [ 3., 3., 3.], [ 0., 0., 0.], [ 0., 0., 0.]])
In [27]でなぜ前の値が残っているのだ??