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

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

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

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

CSV

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

Python

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

pandas

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

Q&A

解決済

1回答

736閲覧

dataframeの列名が完全一致する列に代入したい

rikku_3413

総合スコア11

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

CSV

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

Python

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

pandas

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

1グッド

0クリップ

投稿2022/04/11 06:52

編集2022/04/12 21:52

前提

Pythonを用いて機械学習のデータ前処理を行っています。
もとのデータセットから文字列を要素に含む列を取り出し、ラベルエンコーディングを施しデータの前処理を行いました。
ラベルエンコーディングを施したdataframeを、もとのdataframeに代入したものを新しく保存して学習に使用しようと考えています。

列名が完全一致した箇所に代入する方法を調べてもなかなか出ず、「列の要素に新しい要素を代入する」方法しか見つけられませんでした。

また、元データが98532行×1031列存在しており、元データから列名を直接指定してのラベルエンコーディングが難しくこのような手段を採用しました。

どなたか教えていただけますと幸いです。

実現したいこと

  • ラベルエンコーディング済dataframeを、前処理を施す前のdataframeに上書き

元データ例

abcdefghiklm
11234abc56
27890abc56
34567def56

前処理をしたデータ例

文字列を要素に含むghi列を抽出

ghi
11
21
32

実現したいデータ例

abcdefghiklm
11234156
27890156
34567256

文字列で構成された要素を持つ列の列名を配列に格納する方法はわかるのですが、それを用いて別のdataframeを経由せず、直接ラベルエンコーディングを行う方法も知りたいです。
この場で聞くのも場違いとは思いますが、教えていただけると幸いです。

2022/4/12 追記

こちらの方法で実装できると思っていたのですが、
A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
という警告が出、最後の確認でも更新されていませんでした。
情報量0の列を削除して得られたデータを1度CSVファイルとして書き出し、それを再度読み込んで代入をしたほうがいいのでしょうか?

Python

1#インポート 2import pandas as pd 3 4#ファイル読み込み 5df1 = pd.read_csv('data.csv',low_memory=False) 6 7#情報量0の列を削除 8df2 = df1.loc[:,~(df1.nunique() == 1)] 9 10#文字列を含む列取り出し 11df3 = df2.filter(regex = '[a-zA-Z]+',axis = 'columns') 12 13#ヘッダをリストで格納 14list_head = df3.columns.tolist() 15 16#ラベルエンコーディング 17df4 = [] 18 19for c in list_head: 20 print(c) 21 le = LabelEncoder() 22 le.fit(df3[c]) 23 print(df3[c]) 24 df4.append(le.transform(df3[c])) 25 26#dataframe形式に変換 27df5 = pd.DataFrame(df4, index = list_head) 28 29#代入(行と列が逆だったため転置) 30for i in list_head(): 31 df2[i] = df5.T[i] 32 33#中身確認 34df2.head()
退会済みユーザー👍を押しています

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

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

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

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

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

melian

2022/04/11 07:13

df['ghi'] = [1, 1, 2] などではダメなのでしょうか?
meg_

2022/04/11 10:30

df1['ghi'] = df2['ghi'] で出来ませんか?
rikku_3413

2022/04/12 05:18

melian様、meg_様 ご意見いただきありがとうございます。 ラベルエンコーディング後のデータが356列あり、手入力で代入を行うのが難しい状況です。 forループなどを用いてうまく代入していきたいのですが手法が思いつかず苦戦しております。
meg_

2022/04/12 06:17

> forループなどを用いてうまく代入していきたいのですが手法が思いつかず苦戦しております。 具体的に何に苦戦しているのでしょうか?ループ処理を使用したことがないとかですか?
rikku_3413

2022/04/12 07:09

meg様 返信ありがとうございます。 df.column.tolist()でヘッダを取得し、それを用いてforループを実装して条件を満たすようにプログラムを書いているのですが手間取っています。 詳しいプログラムについては質問に加筆しますので確認をお願いします。
meg_

2022/04/12 08:07

df2[i] = df5.T[i] のところもloc()を使用したらどうなりますでしょうか?
rikku_3413

2022/04/12 22:27

meg_様 返信ありがとうございます。 いただいたアドバイス通り df2.loc[i] = df5.T.loc[i] として実行しましたがエラーになりました。 以下エラー全文です。 ----- KeyError Traceback (most recent call last) /tmp/ipykernel_3343/1282209935.py in <module> 3 print('-----') 4 #print(df3.loc[i]) ----> 5 print(df5.T.loc[i]) 6 df3.loc[i] = df5.T.loc[i] ~/anaconda3/lib/python3.9/site-packages/pandas/core/indexing.py in __getitem__(self, key) 929 930 maybe_callable = com.apply_if_callable(key, self.obj) --> 931 return self._getitem_axis(maybe_callable, axis=axis) 932 933 def _is_scalar_access(self, key: tuple): ~/anaconda3/lib/python3.9/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis) 1162 # fall thru to straight lookup 1163 self._validate_key(key, axis) -> 1164 return self._get_label(key, axis=axis) 1165 1166 def _get_slice_axis(self, slice_obj: slice, axis: int): ~/anaconda3/lib/python3.9/site-packages/pandas/core/indexing.py in _get_label(self, label, axis) 1111 def _get_label(self, label, axis: int): 1112 # GH#5667 this will fail if the label is not present in the axis. -> 1113 return self.obj.xs(label, axis=axis) 1114 1115 def _handle_lowerdim_multi_index_axis0(self, tup: tuple): ~/anaconda3/lib/python3.9/site-packages/pandas/core/generic.py in xs(self, key, axis, level, drop_level) 3774 raise TypeError(f"Expected label or tuple of labels, got {key}") from e 3775 else: -> 3776 loc = index.get_loc(key) 3777 3778 if isinstance(loc, np.ndarray): ~/anaconda3/lib/python3.9/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance) 386 except ValueError as err: 387 raise KeyError(key) from err --> 388 raise KeyError(key) 389 return super().get_loc(key, method=method, tolerance=tolerance) 390 KeyError: 'up' ----- df2にもdf5.Tにもヘッダ「up」は存在するため何が理由でエラーが出ているのかが分かりません。
guest

回答1

0

自己解決

df1.loc[:,i] = df5.T.loc[:,i]
その後に
df2 = df1.loc[:,~(df1.nunique() == 1)]
とすることで問題を解決することができました。

返信いただいたmelian様、meg_様に感謝します。

投稿2022/04/12 23:40

rikku_3413

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問