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

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

新規登録して質問してみよう
ただいま回答率
85.45%
置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

pandas

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

配列

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

Q&A

3回答

8068閲覧

対象の文字列.replace(置換される文字列, 置換する文字列)での置換について

JMS

総合スコア7

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

pandas

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

配列

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

0グッド

1クリップ

投稿2020/05/10 08:01

編集2020/05/10 15:08

Pythonにて、ある配列があります。そのうち、kakei['支出']という列があります。

0 1,526
1 1,808
2 1,712
3 1,515
4 1,874

これを以下の処理しようとするとエラーが発生します(以下にてエラーもコピーしています)。

Python

1kakei['支出']=pd.to_numeric(kakei['支出']) 2 3--------------------------------------------------------------------------- 4ValueError Traceback (most recent call last) 5pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric() 6 7ValueError: Unable to parse string "1,526" 8 9During handling of the above exception, another exception occurred: 10 11ValueError Traceback (most recent call last) 12<ipython-input-224-10d7f4a15742> in <module> 13----> 1 kakei['支出']=pd.to_numeric(kakei['支出']) 14 2 kakei['日付']=kakei['日付'].astype(str) 15 3 kakei['日付']=pd.to_datetime(kakei['日付'],format='%Y年%m月') 16 4 kakei['POSIX']=kakei['日付'].astype['int64'].values//10**9 17 5 kakei['年']=kakei['日付'].dt.year 18 19~\Anaconda3\lib\site-packages\pandas\core\tools\numeric.py in to_numeric(arg, errors, downcast) 20 149 coerce_numeric = errors not in ("ignore", "raise") 21 150 values = lib.maybe_convert_numeric( 22--> 151 values, set(), coerce_numeric=coerce_numeric 23 152 ) 24 153 25 26pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric() 27 28ValueError: Unable to parse string "1,526" at position 0

おそらくエラーの原因は対象となる数値にカンマが入っていることだと考えまして、カンマを削除しようと以下のコードを実行させようとしました。
ただ、こちらも、「error」にはならないのですが、以下に示す通り戻り値ではカンマが削除されません。対処法をご存知の方、ご指導いただけませんでしょうか?

Python

1kakei['支出']=kakei['支出'].replace(',','') 2kakei['支出'] 3 4C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 5A value is trying to be set on a copy of a slice from a DataFrame. 6Try using .loc[row_indexer,col_indexer] = value instead 7 8See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy 9 """Entry point for launching an IPython kernel. 100 1,526 111 1,808 122 1,712 133 1,515 144 1,874 15 ... 1658 2,499 1759 2,731 1860 2,943 1961 2,296 2062 1,118 21Name: 支出, Length: 63, dtype: object

2020/5/10 追加: 
皆様にご指導うけ、コード全文を以下に掲載いたしました。当初は以下のようにしてエラーになってしまったことについてお伺いしました。その後、カンマを削除したりしていくとまた別のエラー出て・・・ということになり先へ進めない状態になってしまっております。

Python

1%matplotlib inline 2import numpy as np 3import pandas as pd 4import seaborn as sb 5import matplotlib.pyplot as plt 6from datetime import datetime 7from sklearn.metrics import mean_absolute_error 8 9kakei=pd.read_excel('FEH_00200565_200510154100.xlsx')#気象庁からDLしたデータ、以下にhead()を表示します。 10kakei.head(10) 11 12統計名: 家計消費状況調査 平成29年改定(20151月~) 二人以上の世帯 Unnamed: 2 Unnamed: 3 130 表番号: 1-1 NaN NaN 141 表題: [インターネットを利用した1世帯当たり1か月間の支出] 全国・地方・都市階級別 NaN NaN 152 実施年月: - - NaN 163 表章項目: 00000 1世帯当たり1か月間の支出額 NaN 174 世帯区分(平成29年改定)0030 二人以上の世帯 NaN 185 品目区分(平成29年改定)0950 69 宿泊料、運賃、パック旅行費(インターネット上での決済)【円】 NaN 196 全国・地方・都市階級(平成29年改定)0050 関東 NaN 207 NaN NaN NaN NaN 218 時間軸(月次・四半期・年次) コード 時間軸(月次・四半期・年次) 値 注釈 229 2015000101 201511,526 NaN 23 24kakei=kakei.drop('Unnamed: 3',axis=1)#一番右の列を不要なので削除 25kakei.columns=['日付コード','日付','支出'] 26kakei=kakei.drop([0,1,2,3,4,5,6,7,8]).reset_index(drop=True)#index=9のところより上は利用しないので削除 27kakei.info()#回答いただける方のため、念のため表示させます 28 29<class 'pandas.core.frame.DataFrame'> 30RangeIndex: 68 entries, 0 to 67 31Data columns (total 3 columns): 32日付コード 67 non-null object 33日付 67 non-null object 34支出 63 non-null object 35dtypes: object(3) 36memory usage: 1.7+ KB 37 38kakei.tail(7)#回答いただける方のため、念のため表示させます。最後の方の行は以下のとおり不要なのでこのあと参照から外します。 39 40 日付コード 日付 支出 4161 2020000202 202022,296 4262 2020000303 202031,118 4363 NaN NaN NaN 4464 *** 数字が得られないもの NaN 4565 - 該当数字がないもの NaN 4666 ... 調査又は集計していないもの NaN 4767 … 調査又は集計していないもの NaN 48 49kakei=kakei.iloc[0:63,:] 50kakei['支出']#回答いただける方のため、念のため表示させます。 51 520 1,526 531 1,808 542 1,712 553 1,515 564 1,874 57 ... 5858 2,499 5959 2,731 6060 2,943 6161 2,296 6262 1,118 63Name: 支出, Length: 63, dtype: object 64 65kakei['支出']=pd.to_numeric(kakei['支出']) 66kakei['日付']=kakei['日付'].astype(str) 67kakei['日付']=pd.to_datetime(kakei['日付'],format='%Y年%m月') 68kakei['POSIX']=kakei['日付'].astype('int64').values//10**9 69kakei['年']=kakei['日付'].dt.year 70kakei['月']=kakei['日付'].dt.month 71 72--------------------------------------------------------------------------- 73ValueError Traceback (most recent call last) 74pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric() 75 76ValueError: Unable to parse string "1,526" 77 78During handling of the above exception, another exception occurred: 79 80ValueError Traceback (most recent call last) 81<ipython-input-301-4852b1d66c7f> in <module> 82----> 1 kakei['支出']=pd.to_numeric(kakei['支出']) 83 2 kakei['日付']=kakei['日付'].astype(str) 84 3 kakei['日付']=pd.to_datetime(kakei['日付'],format='%Y年%m月') 85 4 kakei['POSIX']=kakei['日付'].astype('int64').values//10**9 86 5 kakei['年']=kakei['日付'].dt.year 87 88~\Anaconda3\lib\site-packages\pandas\core\tools\numeric.py in to_numeric(arg, errors, downcast) 89 149 coerce_numeric = errors not in ("ignore", "raise") 90 150 values = lib.maybe_convert_numeric( 91--> 151 values, set(), coerce_numeric=coerce_numeric 92 152 ) 93 153 94 95pandas\_libs\lib.pyx in pandas._libs.lib.maybe_convert_numeric() 96 97ValueError: Unable to parse string "1,526" at position 0 98

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

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

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

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

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

guest

回答3

0

文字列Seriesの要素にアクセスするにはstrアクセサが有用です。Seriesreplaceメソッドは単純に要素文字列に対してそれぞれ置換を行ってくれる訳ではありません(もっと違う用途で使うものです)。

以下のどちらかがいいのでは。

python

1kakei['支出'] = pd.to_numeric(kakei['支出'].str.replace(',',''))

python

1kakei['支出'] = kakei['支出'].str.replace(',','').astype(int)

pandas.Series.str — pandas 1.0.3 documentation
pandas.Series.replace — pandas 1.0.3 documentation

投稿2020/05/10 10:13

編集2020/05/10 10:14
hayataka2049

総合スコア30933

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

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

JMS

2020/05/10 14:54

こちらありがとうございます。 両方とも試してみました。でもどうもエラーがでてしまいうまくいかないようでした。エラーの内容は以下のとおりです。なお、他の方に言われたとおり、いまから全文貼付をしてみます。
hayataka2049

2020/05/10 15:09

? エラー貼り忘れましたか?
JMS

2020/05/12 14:57

すいませんでした。 上の方の処理をしようとすると以下のようになります。 -------------------- kakei['支出'] = pd.to_numeric(kakei['支出'].str.replace(',','')) kakei['日付']=kakei['日付'].astype(str) kakei['日付']=pd.to_datetime(kakei['日付'],format='%Y年%m月') kakei['POSIX']=kakei['日付'].astype('int64').values//10**9 kakei['年']=kakei['日付'].dt.year kakei['月']=kakei['日付'].dt.month C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy """Entry point for launching an IPython kernel. C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:3: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy This is separate from the ipykernel package so we can avoid doing imports until C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:4: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy after removing the cwd from sys.path. C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:5: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy """ C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:6: SettingWithCopyWarning: 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 See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy ------------------------ しかし、お陰様で、その先のコードには進むことができました! SettingWithCopyWarning: というのは、これはエラーではあるものの、このまま進めることのできる類のエラーだったということなのでしょうか。 それとも何等かの注意が出ているだけで、特段のエラーではないのでしょうか? なんでも質問ばかりで申し訳ございません!
guest

0

以下のようなファイル kakei.tsv だと仮定します。

tsv

1番号 支出 20 1,526 31 1,808 42 1,712 53 1,515 64 1,874

これを以下のように処理します。

python

1import numpy as np 2import pandas as pd 3 4kakei = pd.read_csv("kakei.tsv", delimiter='\t', dtype={'番号':int, '支出':str}) 5 6kakei['支出'] = kakei['支出'].apply(lambda x: x.replace(',','')).astype(np.int) 7 8print(kakei)

この場合、以下の出力になります。

番号 支出 0 0 1526 1 1 1808 2 2 1712 3 3 1515 4 4 1874

【参考リンク】

投稿2020/05/10 08:46

編集2020/05/10 08:47
Yasumichi

総合スコア1773

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

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

JMS

2020/05/10 09:18

ありがとうございます! kakei['支出']=kakei['支出'].apply(lambda x: x.replace(',','')).astype(np.int) kakei['支出'] の結果、カンマは消えました! ただ、なぜか、 SettingWithCopyWarning: ・・・・というエラーが何行にもわたってでてしまいます。 その上で、 kakei['支出']=pd.to_numeric(kakei['支出'])をその後やりましたところ、 C:\Users\user-PC\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 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 というエラーになってしまいます。
Yasumichi

2020/05/10 09:26 編集

修正したコード全文を質問に追記で開示することはできますか? あと、to_numeric を行っているということは、数字が入っていない行があるということでしょうか?
JMS

2020/05/10 14:55

ご返信ありがとうございます。おそらく数字ははいっているのですが、データの型が数字になっていないということだと理解しているのですが、なにせ私が初心者なもので、ご質問の意味を完全に理解できていないかもしれません。いずれにしても、再編集しいまから全コードを書きだしてみます。もしよろしければもう一度ご覧いただけませんでしょうか。何度もみていただき本当にすみません。
guest

0

これが参考になると思います

投稿2020/05/10 08:11

kazchimo

総合スコア172

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

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

JMS

2020/05/10 08:35

ご返信ありがとうございます。これを読みまして、私の理解では 1. kakei['支出']=kakei['支出'].replace(',','').copy 2. kakei['支出']=kakei['支出'].copy.replace(',','') と2つのパターンで.copyを付記してみました。 しかし、理解が足りていないのか、結局エラーが出てしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問