質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1099閲覧

forループの結果がCSVで書き出しができません。

wattan

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/04/18 02:06

前提・実現したいこと

forループでKmeansを使って複数のクラスター分析の結果をCSVに書き出しをしたいのですが、最後の結果しか保存できません。print()だと、計算したすべての結果が表示されるのですが、CSVに書き出すと最後のKmeansしか出力されません。どのようなコードにすれば、すべての結果がCSVファイルに出力されるのでしょうか?ご教授いただけますと大変助かります。
■■な機能を実装中に以下のエラーメッセージが発生しました。
エラーではないですが、print()の出力

エラーメッセージ [1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1] [2 1 1 1 1 0 1 1 1 0 1 1 1 1 3 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 3 2 1 1 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0] [2 0 0 0 0 0 0 3 0 0 3 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0] [2 0 0 0 0 0 0 3 0 0 3 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 0] ### 該当のソースコード python ソースコード n_of_dimensions=[2,3,4] n_clusters=[2,4] for i in n_of_dimensions: lsa = TruncatedSVD(n_components=i) #print(lsa.fit_transform(X1)) X = Normalizer(copy=False).fit_transform(X1) for j in n_clusters: km = KMeans(n_clusters=j,init='k-means++',) km.fit(X) #cluster=[] #cluster.append(km.labels_) #print(cluster) labels=km.labels_ #print(labels) np.savetxt('cluster.csv',labels,delimiter=',') ### 試したこと ソースコードのコメントアウトにあるように空の配列を作ってappendするなどしましたが、やぶへびでした。 ### 補足情報(FW/ツールのバージョンなど) jupyter notebook

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

コメントしている内容を見ると、おしい所まで出来ています。
繰り返し処理した内容をまとめて出力するコードは以下の構造にする必要があります。
1.繰り返し処理した結果を格納する変数の定義 cluster=[]
2.以下を繰り返す
kmeansの実施
ラベルを取得して変数(cluster)に追加
3.clusterをファイル出力

今のコードは繰り返すたびにファイル出力しているので、上書きされてしまいます。なお、ファイル出力時に追加するのであれば、numpyのsavetxt以外を使ったほうがいいかもしれません。(標準機能にappendがないため)

投稿2018/04/18 04:46

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wattan

2018/04/18 10:57

ご助力いただきありがとうございます。いい線いっているとのことで、この線で考えたらうまくいきました。ありがとうございます。
guest

0

コードが部分的なので他の原因かもしれませんが、テキストをappendモードで開いていないことが原因だと思います。
参考
参考リンク

投稿2018/04/18 02:26

編集2018/04/18 02:27
GOTA77

総合スコア160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wattan

2018/04/18 10:59

ご助力いただきありがとうございます。おそらく私が、「テキストをappendモードで開いていない」ということが理解できなかったので、いただいたご助言では、うまくいきませんでした。しかし、appendモードというものがあるということを知ることができたので、大変勉強になりました。ありがとうございます。
guest

0

いただいた方法を参考にしながら、以下の方法で欲しい結果を得ることができました。

cluster=[]
n_of_dimensions=[2,3,4]
n_clusters=[2,4,5]
for i in n_of_dimensions:
lsa = TruncatedSVD(n_components=i)
,,,#print(lsa.fit_transform(X1))
X = Normalizer(copy=False).fit_transform(X1)
for j in n_clusters:
km = KMeans(n_clusters=j,init='k-means++',)
km.fit(X)
cluster.append(km.labels_)
,,,#print(cluster)
,,,#labels=km.labels_
,,,#print(labels)
,,,#with open('cl2.txt','a') as f_handle:要らない
,,,#np.savetxt('cl4.csv',cl2,delimiter=',')
df01=pd.DataFrame(cluster)
df_cl=df01.T
df_cl.to_csv('test_CL.csv')

Numpyで転置ができるのでしょうが、私にはやり方がわからなかったので、Pandasでやりました。forの前で、clusterの空の配列を用意し、appendでKMeansで計算される結果を追加することで上書きされずに済んだのだ思います。そしてその結果を、Pandasでデータフレームにして転置。その後、CSVで保存。

投稿2018/04/18 11:07

編集2018/04/18 11:13
wattan

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問