🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

pandas

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

Q&A

解決済

2回答

5432閲覧

python:エクセルで数値以外(文字、空白行等)の行を削除したい

python_2019

総合スコア68

Python

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

pandas

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

0グッド

0クリップ

投稿2020/01/05 07:32

編集2020/01/05 08:02

エクセルで数値以外(文字、空白行等)の行を削除したいのですが、
どのようにすればよいでしょうか?

空白行の削除だけならば、以下のコードでなんとか実現できたのですが、
文字や記号などを含む行削除方法がなかなかネットでも見つかりません。

ご存じの方、ご指導頂ければありがたいです。
よろしくお願いいたします。

空白行の削除

# データの読み込み df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') # 空白行を削除 df2=df.dropna()

エクセルデータ(青の部分(空欄と文字)を含む行全体(2~6行目)を削除したいです)
イメージ説明

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

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

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

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

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

meg_

2020/01/05 07:36

タグに「機械学習」とありますが、この質問には関係ないので外してください。 代わりに「Pandas」タグをつけた方が回答がつきやすくなるかと思います。
python_2019

2020/01/05 07:44

ありがとうございます。 ご指摘の通りタグを修正させていただきました。 よろしくお願いいたします。
frederick_1974

2020/01/05 07:52

Excelのデータ構造がよく分からないのですが、 文字が入っていれば、その行の他のセルに数字が入っていても削除するのでしょうか。あるいは、文字が入っている行には、文字のセルしか入っていないのでしょうか。 また、文字が入っている列の別の行にはデータとして必要な数字も入っているのでしょうか?
python_2019

2020/01/05 07:59

文字が入っている行には数値も入っています。 1つでもセルに文字が入っていれば、数値が入っていてもその行を削除したいと考えています。 説明不足で失礼いたしました。 実際のエクセルデータをアップしました。 どうぞよろしくお願いいたします。
guest

回答2

0

ベストアンサー

Seriesの値を数値に変換する方法です。
数値以外はNanになるので必要に応じて削除する等してください。

Python

1import pandas as pd 2 3df = pd.DataFrame({'A':[1,2,'-'],'B':[3,5,6],'C':['10',5,'abc']}) 4print(df) 5# A B C 6#0 1 3 10 7#1 2 5 5 8#2 - 6 abc 9 10print(df.dtypes) 11#A object 12#B int64 13#C object 14#dtype: object 15 16df['A'] = pd.to_numeric(df['A'], errors='coerce') 17df['B'] = pd.to_numeric(df['B'], errors='coerce') 18df['C'] = pd.to_numeric(df['C'], errors='coerce') 19print(df) 20# A B C 21#0 1.0 3 10.0 22#1 2.0 5 5.0 23#2 Nan 6 Nan 24 25print(df.dtypes) 26#A float64 27#B int64 28#C float64 29#dtype: object

投稿2020/01/05 08:08

meg_

総合スコア10736

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

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

python_2019

2020/01/05 08:21

ご指導ありがとうございます。 お教え頂きました、print(df.dtypes)しますと、「float64」「object」の2種類が表示されました。 これから、objectとNaNを削除できればと思いますが、読み込んだエクセルファイルからそれをどう実現すべきか、具体的なコードが思いつきません。。 勉強不足で申し訳ございません。 ご示唆頂けますと助かります。 よろしくお願いいたします。
meg_

2020/01/05 09:18

質問者さんのコードにある「df.dropna()」でNanのある行が削除できます。
python_2019

2020/01/05 09:27

ご連絡ありがとうございます。 df.dropna()でNanのある行が削除できること、承知いたしました。 その前の行でエクセルを読み込んでいるのですが、その直後に、お教え頂いたコードを挿入すればよろしいでしょうか? お教え頂いたコードは、print(df.dtypes)で、float64などのタイプが表示されますが、これをどのように、df.dropna()へ繋げればよいでしょうか? 何度も申し訳ございません よろしくお願いいたします。
meg_

2020/01/05 09:36

回答したコードの「print」の部分は確認のためなので、実際のコードには不要です。 1.データをpandasで読み込む。 2.pd.to_numeric()でデータを処理する。 3.dropna()で不要なデータ(Nanを含む行)を削除する の流れで良いと思います。
python_2019

2020/01/05 09:41

ご連絡ありがとうございます。 以下のようなコードを実行しました。 df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') df1 = pd.to_numeric(df, errors='coerce') df1=df.dropna() すると、以下のようなエラーが出ました。 「TypeError: arg must be a list, tuple, 1-d array, or Series」 何かtypeの変換などが必要なのでしょうか? ご指導頂ければ助かります。 何度も申し訳ありません。。
python_2019

2020/01/05 09:50

追記です。 上記のエラーは、df1 = pd.to_numeric(df, errors='coerce') で発生しております。 どうぞよろしくお願いいたします。
meg_

2020/01/05 11:38

to_numericはDataFrameではなくSeriesに対して実行してください。DataFrameには適応できない関数です。DataFrame全体を処理する場合はループ処理で各Seriesに対してこの関数を適用してください。
python_2019

2020/01/05 12:56

ご連絡ありがとうございます。 以下の通り修正してみました。 df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') df1 = pd.Series([df]) df1= pd.to_numeric(df1,errors='coerce') df1=df1.dropna() ここではエラーは出なくなったのですが、後続処理で、「ValueError: could not convert string to float: 'bbb'」のエラーがでます。 「bbb」はpd.to_numericの処理でNaNに変換されていないようです。 DataFrame全体を処理するループ処理が必要なのかと思われますが、どのように記述すればよろしいでしょうか? 何度もお手数おかけして申し訳ございません。 どうかよろしくお願いいたします。
meg_

2020/01/05 14:08

私のコードの様にSeries1つずつにto_numeric()してみてください。
python_2019

2020/01/05 14:17

ご連絡ありがとうございます。 「Series1つずつ」というのは、「列名1つずつ」ということでしょうか? そういたしますと、列数が250あり、列名も全て異なるのですが、どのようにすればよろしいでしょうか? 理解が及ばず申し訳ございません。 よろしくお願いいたします。
meg_

2020/01/05 14:28

下記のような感じではどうですか? for i in df.columns: df[i] = pd.to_numeric(df[i], errors='coerce')
python_2019

2020/01/05 14:49

ありがとうございます。 ご指導頂いたループを以下の通りコードしました。 df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数') df = pd.Series([df]) for i in df.columns: df[i] = pd.to_numeric(df[i], errors='coerce') df=df.dropna() そうしましたら、以下のようなエラーが出てしまいました。。。 AttributeError: 'Series' object has no attribute 'columns'
meg_

2020/01/05 15:10

下記は不要です。 df = pd.Series([df])
python_2019

2020/01/05 15:14

あ、エラーがなくなり、上手く行きました! 空白も文字も数値以外のデータ行が完全に削除されました。 半分諦めていたので、もう涙が出るほど嬉しいです! 最後まで面倒を見て頂き、本当に感謝いたします。 ありがとうございました。
python_2019

2020/01/05 15:35

すみません。 もう1点だけお教えください。 先ほどのループで、最初の1列目だけはそのままで、2列目から最後までNaNに変換するにはどうすればよいでしょうか? 実は1列目はインデックス(文字:a001などの連番)に使っているのでそのままのにしておきたいのです。 追加で申し訳ございません。 ご指導よろしくお願いいたします。
meg_

2020/01/05 15:49

エクセルから読み込むときにインデックスを指定出来るようです。 df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数', index_col=0)
python_2019

2020/01/05 15:49

すみません。 自己解決しました。 for i in df.columns[1:]: ありがとうございました。
python_2019

2020/01/05 15:50

df = pd.read_excel('target+notarget_未知.xlsx',sheet_name='説明変数', index_col=0) このような方法もあるのですね。 こちらも勉強のため試したいと思います。 ありがとうございました。
guest

0

質問の直接の回答にはならないかもしれないですが、数字のみ取り出すのはいかがですか?

投稿2020/01/05 07:38

surphy

総合スコア101

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

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

python_2019

2020/01/05 07:46

ご連絡ありがとうございます。 はい、数字のみ取り出す方法も調べていたのですが、なかなかネットで情報が見つからない状況です。 お知恵をお貸し頂けたら幸いです。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問