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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

4回答

909閲覧

python csvの数値当てはめ

techno

総合スコア22

CSV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/09/11 05:20

前提・実現したいこと

前回お聞きしたものと近い感じなのですが
下記の内容のコンマで区切られたcsvデータがあるのですが
6つの数字(横)でひとくくり
それが10個あるデータ
(数字のデータはソートしてあり数の小さいのから大きいものにならべかえしてあります)

data.csv

2,5,8,9,10,15
1,5,7,9,11,15
1,4,8,10,11,12
5,6,7,13,15,16
8,10,11,13,14
4,5,6,15,17,18
2,4,6,8,10,15
3,6,9,12,15,18
3,5,7,8,11,17
7,9,10,11,12,16

これらを取り込み行を基準にその場所にその数値を入れ込みdata2.csvで出力することは可能でしょうか?
下記の表のように

*黄色の部分は要りません

イメージ説明

data2.csv
,2,,,5,,,8,9,10,,,,,15,,,
1,,,,5,,7,,9,,11,,,,15,,,
1,,,4,,,,8,,10,11,12,,,,,,
,,,,5,6,7,,,,,,13,,15,16,,
,,,,,,,8,,10,11,,13,14,,,,
,,,4,5,6,,,,,,,,,15,,17,18
,2,,4,,6,,8,,10,,,,,15,,,
,,3,,,6,,,9,,,12,,,15,,,18
,,3,,5,,7,8,,,11,,,,,,17,
,,,,,,7,,9,10,11,12,,,,16,,

↑ 
エクセルで開いた時に画像のようになるよう

data.csvをdata2.csv にしたい

該当のソースコード

python

1 2# ↓ 前回教えて頂いたの流用です 3 df = pd.read_csv('data.csv', header=None).fillna(0).astype(int) #data.csv 4 arr = df.to_numpy() 5 6#### ↓ ここの躓き 7 out = np.where((arr==np.arange(arr.max()+1)[:, None, None]).any(2).T, '1', '') 8#### 9 pd.DataFrame(out[:, 1:]).to_csv('data2.csv', header=None, index=None, encoding='utf_8_sig')

試したこと

前回教えて頂いたコードで試行錯誤したのですがのですが肝心な部分が考え付きませんでした

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

t_obara

2020/09/11 06:03

なぜこのようなデータが欲しいのですか? そもそもこのようなデータがなくても別な方法で元々の課題が解決できるんじゃ無いかと思った次第です。
guest

回答4

0

提示コードを生かせば、以下のような処理でできます。

Python

1import pandas as pd 2import numpy as np 3from io import StringIO 4 5s = """2,5,8,9,10,15 61,5,7,9,11,15 71,4,8,10,11,12 85,6,7,13,15,16 98,10,11,13,14 104,5,6,15,17,18 112,4,6,8,10,15 123,6,9,12,15,18 133,5,7,8,11,17 147,9,10,11,12,16""" 15df = pd.read_csv(StringIO(s), header=None) 16df = df.fillna(0).astype(int) 17 18arr = df.to_numpy() 19MAX = arr.max() 20out = np.where((arr==np.arange(MAX+1)[:, None, None]).any(2).T, 1, 0) 21out = out[:, 1:] 22 23# 1...18 を並べたものを要素毎に掛ける 24num = np.arange(1, MAX+1) 25 26df = pd.DataFrame(out * num).astype(str).replace('0', '') 27df.to_csv('data2.csv', header=None, index=None) 28""" 29,2,,,5,,,8,9,10,,,,,15,,, 301,,,,5,,7,,9,,11,,,,15,,, 311,,,4,,,,8,,10,11,12,,,,,, 32,,,,5,6,7,,,,,,13,,15,16,, 33,,,,,,,8,,10,11,,13,14,,,, 34,,,4,5,6,,,,,,,,,15,,17,18 35,2,,4,,6,,8,,10,,,,,15,,, 36,,3,,,6,,,9,,,12,,,15,,,18 37,,3,,5,,7,8,,,11,,,,,,17, 38,,,,,,7,,9,10,11,12,,,,16,, 39"""

投稿2020/09/11 06:27

編集2020/09/11 07:30
can110

総合スコア38341

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

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

bsdfan

2020/09/11 07:19

num をわざわざ作らなくても、np.arange(1, MAX) との掛け算だけでできると思います。
can110

2020/09/11 07:32

ブロードキャストで大丈夫ですね。回答も修正しておきました。 ご指摘ありがとうございます。
bsdfan

2020/09/11 07:40

いつも勉強させていただいています。MAX+1でしたね。ありがとうございます。
guest

0

can110さんのやり方をちょっと変えたやり方です。
1~18ではなく、np.whereの適用配列と同じ0~18×10のサイズの二次元配列を作成して、
whereのTrue時の置換対象配列として指定することで直接数値を設定します。

python

1import pandas as pd 2import numpy as np 3 4df = pd.read_csv('data.csv', header=None).fillna(0).astype(int) #data.csv 5arr = df.to_numpy() 6 7MAX = arr.max() 8num = np.array([i for i in range(MAX + 1)] * arr.shape[0]).reshape(-1,MAX + 1) 9print(num) 10''' 11[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 12 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 13 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 14 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 15 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 16 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 17 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 18 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 19 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18] 20 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]] 21''' 22 23out = np.where((arr==np.arange(arr.max()+1)[:, None, None]).any(2).T, num, '') 24 25pd.DataFrame(out[:, 1:]).to_csv('data2.csv', header=None, index=None, encoding='utf_8_sig') 26''' 27,2,,,5,,,8,9,10,,,,,15,,, 281,,,,5,,7,,9,,11,,,,15,,, 291,,,4,,,,8,,10,11,12,,,,,, 30,,,,5,6,7,,,,,,13,,15,16,, 31,,,,,,,8,,10,11,,13,14,,,, 32,,,4,5,6,,,,,,,,,15,,17,18 33,2,,4,,6,,8,,10,,,,,15,,, 34,,3,,,6,,,9,,,12,,,15,,,18 35,,3,,5,,7,8,,,11,,,,,,17, 36,,,,,,7,,9,10,11,12,,,,16,, 37'''

投稿2020/09/11 06:44

編集2020/09/11 06:45
yureighost

総合スコア2183

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

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

0

ベストアンサー

numpyに便利な関数があるに違いないと思って探してみたら、numpy.put_along_axis()というのがありました。

python

1import pandas as pd 2import numpy as np 3 4df = pd.read_csv('data.csv', header=None).fillna(0).astype(int) 5arr = df.to_numpy() 6 7# 出力用の配列の作成 8out = np.zeros((len(arr), arr.max() + 1), dtype=np.int) 9 10# arrをインデックスとして、outのその位置にarrの値を書く 11np.put_along_axis(out, arr, arr, axis=1) 12# np.put_along_axis(out, arr, 1, axis=1) # 1を書く場合 13 14df = pd.DataFrame(out[:, 1:]).astype(str).replace('0', '') 15df.to_csv('data2.csv', header=False, index=False)

投稿2020/09/12 07:22

bsdfan

総合スコア4794

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

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

0

模範解答が既に出ているので、変な例を一つ。
テキストとして読み込んで、1行ずつ「1つ前の数字との差だけカンマを足す」操作をしてもっかいテキストとして保存してます。例:2,5→2,,,5

python3

1with open("data.csv") as f: 2 lines = f.readlines() 3 data2 = list() 4 for line in lines: 5 num_lst = list(map(int,line.split(","))) 6 add_comma = "" 7 pre_num = 1 8 for num in num_lst: 9 add_comma += ","*(num-pre_num)+str(num) # 前の数との差分だけカンマを足す 10 pre_num = num 11 add_comma += ","*(18-pre_num) 12 data2.append(add_comma) 13 14with open("data2.csv", mode='w') as f: 15 f.write('\n'.join(data2))

投稿2020/09/11 07:20

jeanbiego

総合スコア3966

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問