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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1151閲覧

csvを読み込んだ二次元配列を特定の列を基準にソート

mxrs2

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/06/07 01:52

numpyでcsvを配列に取り込み、特定の列を基準にソートして再出力しようとおもっています
今回は36列目を基準にソートしたいのですが、取り込む配列には1行目がヘッダーとなっています
ただソートしただけではヘッダー部分もソートの対象となってしまうので一度np.delete()でヘッダー部分を削除してsort()でソートを行い、再出力する前にヘッダー部分を挿入しようと思いました
しかしnp.delete()でヘッダーを削除したあとにソートを行おうとすると
TypeError: 'key' is an invalid keyword argument for sort()
といったエラーが返ってきます
np.delete()を行わずソートした場合、ソートはできるのですが、ヘッダー部分もソートの対象となってしまいます
以下がcsvの読み込み、ヘッダーの削除、ソート、ヘッダーの挿入部分のコードになります

Python

1filename = os.path.splitext(os.path.basename(sys.argv[1]))[0] 2ha = (np.loadtxt(fname=sys.argv[1], dtype="str",delimiter=",",)).tolist() 3header = ha[0] 4ha = np.delete(ha, 0, 0) 5ha.sort(key=lambda x: int(x[35])) 6ha = np.insert(ha, 0, header)

検索してみても解決策がいまいちわかりませんでした
ヘッダー部分はそのままでソートを行う方法はなにかありますでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

can110さん、bsdfanさんが書かれているように、numpyでやるよりもpandasを使う方が簡単です。

その理由は、numpyのndarrayとpandasのDataFrameではデータの型の持ち方が(表面上)違うためです。

numpyのndarrayは多次元の配列で、全体として一つの型(dtype)を持ちます。そのために、1行目に文字列があり、2行目以降が全て浮動小数や整数であったとしても型はstrにしないと読み込めなかったりします。1行目を読み飛ばせば浮動小数として読める場合もありますが、文字列の列と浮動小数や整数の列が混在しているとそれもできません。

pandasのDataFrameは二次元の表で、列名(columns)を持ち、列ごとに型(dtype)を持ちます。そのため、csvファイルをより柔軟に読み込んで操作することができます。

実装上は、DataFrameの値(values)はnpのndarrayを使っているのですが、使用する場合のインタフェースはpandasが吸収してくれるのでnumpyの難しい部分を気にする必要はありません。

投稿2021/06/07 11:30

ppaul

総合スコア24666

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

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

mxrs2

2021/06/08 01:31

>文字列の列と浮動小数や整数の列が混在しているとそれもできません。 まさにここで悩んでいました 他の方が言っているようにPandasを利用しようと思います
guest

0

こういう場合はpandasを使うと簡単にできると思います。

numpyで頑張るなら、

python

1ha = np.loadtxt(fname=sys.argv[1], dtype=str, delimiter=',') 2 3# ヘッダ行を除いて35列目をintとしてargsort (+1はヘッダ行分) 4idx = ha[1:, 35].astype(int).argsort() + 1 5 6 7# ソート後の配列 (ヘッダ行(0)を先頭に追加) 8ha = ha[np.r_[0, idx]] 9 10# np.r_ が分かりにくければ、これでもいいです 11# ha = ha[[0] + idx.tolist()]

投稿2021/06/07 08:05

bsdfan

総合スコア4571

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

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

0

この手の処理はpandasを使った方が簡単ですので利用を検討ください。

Python

1import pandas as pd 2 3df = pd.read_csv('inp.txt') 4""" 5c1,c2,c3 6a,1,30 7b,2,20 8c,3,10 9""" 10 11df = df.sort_values(df.columns[2]) # "c3"列で昇順ソート 12print(df) 13# c1 c2 c3 14#2 c 3 10 15#1 b 2 20 16#0 a 1 30 17 18df.to_csv('out_pandas.txt', index=False) 19""" 20c1,c2,c3 21c,3,10 22b,2,20 23a,1,30 24"""

投稿2021/06/07 08:00

can110

総合スコア38266

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

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

0

python

1import os 2import numpy as np 3import sys 4 5filename = os.path.splitext(os.path.basename(sys.argv[1]))[0] 6ha = np.loadtxt(fname=sys.argv[1], dtype="str", delimiter=",",) 7print(ha) 8# [['a' 'one' 'two' 'three'] 9# ['one' '0' '2' '5'] 10# ['two' '5' '4' '3'] 11# ['three' '1' '1' '8']] 12 13header = ha[0] 14# 1行目削除 15ha = np.delete(ha, 0, 0) 16 17# 列を指定して並び替え その時のインデックス情報を取得 18index = np.argsort(ha[:, 2]) 19# 取得したインデックス情報で配列要素を並び替え 20ha = ha[index, :] 21 22# 削除したヘッダを挿入 23ha = np.insert(ha, 0, header, axis=0) 24print(ha) 25# [['a' 'one' 'two' 'three'] 26# ['three' '1' '1' '8'] 27# ['one' '0' '2' '5'] 28# ['two' '5' '4' '3']]

こんな感じでどうでしょうか?
変更点は並べ替えの部分です。
また、自分の環境ではヘッダ挿入のところで1次元配列になってしまったので、axis=0の引数を追加しています。

参考にしたサイト(特定の列で並べ替え)
https://hiegph.hatenablog.com/entry/2019/01/07/234953

投稿2021/06/07 07:34

irognodyci

総合スコア227

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問