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

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

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

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

pandas

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

Q&A

解決済

3回答

674閲覧

pandasのデータフレームで、部分一致したデータの書き換え処理をしたい

jkichi

総合スコア3

Python

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

pandas

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

0グッド

0クリップ

投稿2021/05/16 07:49

前提・実現したいこと

pandasのデータフレームに対して、部分一致したデータの書き換え処理をしたいです。

商品名 産地
0 みかん 日本-愛媛
1 もも  日本-長野
2 りんご 日本-青森

上記のデータフレームに対して次の処理をすると、下記のように書き換えができます。

pandas

1country = ‘日本’ 2df.loc[df[‘産地’].str.contains(country),‘産地’] = country

商品名 産地
0 みかん 日本
1 もも  日本
2 りんご 日本

書き換えが日本のみの場合は上記で問題ありませんが、書き換えたい国が複数ある場合の処理についてプログラムを組みたいのですが、どのようにすればよいかご教示いただけないでしょうか。

<書き換え前>
商品名 産地
0 みかん 日本-愛媛
1 もも  日本-長野
2 りんご 日本-青森
3 メロン アメリカ-カリフォルニア
4 イチゴ アメリカ-ルイジアナ
5 ナシ  アメリカ-オレゴン
6 キウイ ニュージーランド-タウランガ

<書き換え後>
商品名 産地
0 みかん 日本
1 もも  日本
2 りんご 日本
3 メロン アメリカ
4 イチゴ アメリカ
5 ナシ  アメリカ
6 キウイ ニュージーランド

恐れ入りますがよろしくお願い致します。

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

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

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

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

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

meg_

2021/05/16 09:11

> 書き換えたい国が複数ある場合 その複数の国は事前に分かっているのでしょうか?またループ処理については書けますか?
jkichi

2021/05/16 09:28

ご返答いただきありがとうございます。 複数の国については事前に分かっています。 またループ処理については、間違っているかもしれませんが、下記のように書いて試してみたのですが、「TypeError: unhashable type: 'list'」というエラーが出てしまいました。 country = [‘日本’, 'アメリカ'] for product in country: df.loc[df[‘産地’].str.contains(country),‘産地’] = country 初学者のため、基本的な間違えをしているのかもしれませんが、ご教示いただけると幸いです。 よろしくお願い申し上げます。
meg_

2021/05/16 10:33

ループ処理とはforやwhileのことです。使ったことないですか? ※追加の情報は質問に追記してください。(質問は編集可能です)
jkichi

2021/05/16 10:59

学習したことがある程度で、実際に利用したことはないです。 下記のプログラムがループ処理で利用できるようでしたら、ご教示いただけると幸いです。 よろしくお願い致します。 country = [‘日本’, 'アメリカ'] df.loc[df[‘産地’].str.contains(country),‘産地’] = country
guest

回答3

0

ベストアンサー

ほとんどできていますが、あと少しでした。
複数の値をリストで持つときに、変数名を複数形にして、for文の変数を単数形にしてループさせると、イメージしやすいのではないでしょうか。

python

1countries = ['日本', 'アメリカ', 'ニュージーランド'] 2for country in countries: 3 df.loc[df['産地'].str.contains(country), '産地'] = country

投稿2021/05/16 13:11

bsdfan

総合スコア4794

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

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

jkichi

2021/05/16 13:44

無事、やりたかったことができました。 これで先に進めます! ご回答いただきありがとうございました。 初歩的な質問にもご回答いただき大変感謝しております。
guest

0

国名の終わりが"-"であるのであれば、正規表現とpandasのapplyを使って以下のように書けます。

python

1>>> import re 2>>> 3>>> df['産地'] = df['産地'].apply(lambda x: re.sub(r'-.*', '', x)) 4>>> print(df) 5 商品名 産地 60 みかん 日本 71 もも 日本 82 りんご 日本 93 メロン アメリカ 104 イチゴ アメリカ 115 ナシ アメリカ 126 キウイ ニュージーランド

元のデータは以下です。

python

1>>> import pandas as pd 2>>> import io 3>>> 4>>> indata = '''商品名 産地 5... 0 みかん 日本-愛媛 6... 1 もも 日本-長野 7... 2 りんご 日本-青森 8... 3 メロン アメリカ-カリフォルニア 9... 4 イチゴ アメリカ-ルイジアナ 10... 5 ナシ アメリカ-オレゴン 11... 6 キウイ ニュージーランド-タウランガ''' 12>>> 13>>> with io.StringIO(indata) as f: 14... df = pd.read_csv(f, sep=' +', engine='python') 15... 16>>> print(df) 17 商品名 産地 180 みかん 日本-愛媛 191 もも 日本-長野 202 りんご 日本-青森 213 メロン アメリカ-カリフォルニア 224 イチゴ アメリカ-ルイジアナ 235 ナシ アメリカ-オレゴン 246 キウイ ニュージーランド-タウランガ

投稿2021/05/16 09:33

ppaul

総合スコア24670

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

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

jkichi

2021/05/16 10:10

ご回答いただきありがとうございました。 また、説明が不足しているところがあり大変申し訳ございませんでした。 産地については形式が様々なので あらかじめ指定した「特定の文字」を含むデータを、それと同じ「特定の文字」に置き換える処理をしたいと考えております。 例えば、今回の質問で挙げさせていただいたように 「日本」に部分一致した文字列を「日本」に書き換える といった具合です。 日本だけなら下記の処理で上手くいきます。 country = ‘日本’ df.loc[df[‘産地’].str.contains(country),‘産地’] = country なので、これを繰り返せばいいと思い下記のようにやってみたのですが、「TypeError: unhashable type: 'list'」というエラーが出てしまいました。 country = [‘日本’, 'アメリカ'] for product in country: df.loc[df[‘産地’].str.contains(country),‘産地’] = country お手数をお掛け致しますが、再度ご検討いただけると幸いです。 よろしくお願い申し上げます。
guest

0

こんばんは。

問題文拝見しました。

こちらでいかがでしょうか?

Python

1import pandas as pd 2 3# データを読み込む。 4df = pd.read_csv('./hoge.csv') 5 6for index, row in df.iterrows(): 7 df.at[index, '産地'] = row['産地'].split('-')[0] 8 9print(df)

ご確認のほど、よろしくお願いいたします。????‍♂️

<参考>
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数)

投稿2021/05/16 09:28

編集2021/05/16 09:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問