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

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

ただいまの
回答率

88.92%

python 数値穴埋め?変換?がしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 191

techno

score 21

前提・実現したいこと

下記の内容のコンマで区切られた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

これを読み取りなんやかんやして
下記のエクセル画像のように
それぞれの所に当てはめ更に画像の下の様にcsvにする事は可能でしょうか?
(下記のCSVにするのはエクセルで読み込むため)

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

イメージ説明

data2.csv
,1,,,1,,,1,1,1,,,,,1,,,
1,,,,1,,1,,1,,1,,,,1,,,
1,,,1,,,,1,,1,1,1,,,,,,
,,,,1,1,1,,,,,,1,,1,1,,
,,,,,,,1,,1,1,,1,1,,,,
,,,1,1,1,,,,,,,,,1,,1,1
,1,,1,,1,,1,,1,,,,,1,,,
,,1,,,1,,,1,,,1,,,1,,,1
,,1,,1,,1,1,,,1,,,,,,1,
,,,,,,1,,1,1,1,1,,,,1,,

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

data.csvをdata2.csv にしたい

可能であるのならその考え方
可能でないのであればその実現方法をご教示いただけますと幸いです。
よろしくお願いします。

試したこと

python のpandas

pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出
リンク内容

pandas.DataFrame, Seriesの要素の値を置換するreplace
リンク内容

がヒント…思考的にとっかかりがあると思ったのですが決定打には至りませんでした

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

素直に実装すると以下のような感じで書けます。

import pandas as pd
from io import StringIO
import numpy as np

# ダミーデータ
s = """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"""
df = pd.read_csv(StringIO(s), header=None)
df = df.fillna(0)

ary = df.values.astype(int)
row_size = np.max(ary) # 行の長さ

bit_rows = []
for row in ary:
    # 指定の列位置に「1」をセット
    bit_row = [0 for _ in range(row_size)]
    for c in row:
        if c > 0:
            bit_row[c-1] = 1
    bit_rows.append(bit_row)

df = pd.DataFrame(bit_rows, columns=[f'{i+1}' for i in range(row_size)])
print(df)
"""
   1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18
0  0  1  0  0  1  0  0  1  1   1   0   0   0   0   1   0   0   0
1  1  0  0  0  1  0  1  0  1   0   1   0   0   0   1   0   0   0
2  1  0  0  1  0  0  0  1  0   1   1   1   0   0   0   0   0   0
3  0  0  0  0  1  1  1  0  0   0   0   0   1   0   1   1   0   0
4  0  0  0  0  0  0  0  1  0   1   1   0   1   1   0   0   0   0
5  0  0  0  1  1  1  0  0  0   0   0   0   0   0   1   0   1   1
6  0  1  0  1  0  1  0  1  0   1   0   0   0   0   1   0   0   0
7  0  0  1  0  0  1  0  0  1   0   0   1   0   0   1   0   0   1
8  0  0  1  0  1  0  1  1  0   0   1   0   0   0   0   0   1   0
9  0  0  0  0  0  0  1  0  1   1   1   1   0   0   0   1   0   0
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/28 10:27

    お答えいただきありがとうございます。
    kirara0048さんにもお聞きしたのですが
    こう言った考えはどういう風に考えていったらいいのでしょうか?
    まず何をしたいかを考えそこからどういう風に実装したらいいか、その実装の仕方が思いつかないのです(記述の仕方、考え方、実装の仕方)

    キャンセル

checkベストアンサー

0

import numpy as np
import pandas as pd

df = pd.read_csv('data.csv', header=None).fillna(0).astype(int)
arr = df.to_numpy()
arr
# array([[ 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,  0],
#        [ 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]])

このとき、

# 方法1
out = np.full((len(arr), arr.max()+1), '', dtype='U1')
np.put_along_axis(out, arr, '1', 1)
pd.DataFrame(out[:, 1:]).to_csv('data2.csv', header=None, index=None)

# 方法2
out = np.where((arr==np.arange(arr.max()+1)[:, None, None]).any(2).T, '1', '')
pd.DataFrame(out[:, 1:]).to_csv('data2.csv', header=None, index=None)
,1,,,1,,,1,1,1,,,,,1,,,
1,,,,1,,1,,1,,1,,,,1,,,
1,,,1,,,,1,,1,1,1,,,,,,
,,,,1,1,1,,,,,,1,,1,1,,
,,,,,,,1,,1,1,,1,1,,,,
,,,1,1,1,,,,,,,,,1,,1,1
,1,,1,,1,,1,,1,,,,,1,,,
,,1,,,1,,,1,,,1,,,1,,,1
,,1,,1,,1,1,,,1,,,,,,1,
,,,,,,1,,1,1,1,1,,,,1,,

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/28 10:26

    お返事遅れて大変申し訳ございません
    ありがとうございました
    不躾ながらお聞きしたいのですがこう言った考えはどういう風に考えていったらいいのでしょうか?
    まず何をしたいかを考えそこからどういう風に実装したらいいか、その実装の仕方が思いつかないのです(記述の仕方、考え方、実装の仕方)

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る