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

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

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

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

pandas

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

Q&A

解決済

1回答

4159閲覧

pythonのpandasを使って、ある列の値を他のファイルの値に置換したい

ars_lon

総合スコア13

Python

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

pandas

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

0グッド

0クリップ

投稿2018/11/26 05:49

pythonのpandasを使って、ある列の値を他のファイルの値に置換しようとしております。

file1の'sample_name'の列には
sample1
sample2
sample3
sample4
sample8
sample8
...
のようにsample1からsample30が重複、欠失ありで並んでいます。(行数自体は30より多くなっています。)

file2にはsample1からsample30に対応したsample名が

CNV_2nd_050_9
CNV_2nd_051_19
CNV_2nd_052_031M
CNV_2nd_053_031
CNV_2nd_054_041
CNV_2nd_055_041-2
...

のように30個羅列してあります。

file1の'sample_name'の列をfile2のsample名に置換しようとしています。

pandasのmergeを使って置換しようとしたのですが、
TypeError: object of type 'NoneType' has no len()
のようなエラーが出てしまいました。
mapメソッドでもできそうだと思いましたが、辞書形式に直すのも大変そうなので何かいい方法がないかと悩んでいます。

何かいい方法をご存知でしたら、教えていただければと思います。
できればpythonの方法を教えていただけますと幸いです。

よろしくお願い致します。

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

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

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

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

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

can110

2018/11/26 05:51

現在出来ているソースコードを追記ください。
ars_lon

2018/11/26 06:35

失礼いたしました。pd.merge(df1,df2,left_on='sample_name',how='right')を実行した結果、エラーが出ました。df1がfile1,df2がfile2です。
can110

2018/11/26 06:39

それだけだは何がなんだかわからないので、もう少し広範囲のソースコードを本文に追記ください
guest

回答1

0

ベストアンサー

file2にはfile1sample_name対応するキー情報がないのでDataFrameとして読み込んだだけでは役に立ちません。
sample1->CNV_2nd_050_9のような対応表を自力で作成する必要があります。
私ならfile2はリストとして読込、リストから辞書を作成して以下のように処理します。

Python

1import pandas as pd 2import numpy as np 3 4# file1をDataFrameに読込む。省略 5df = pd.DataFrame({'sample_name':['sample1','sample3', np.NaN, 'sample1']}) 6print(df) 7 8# file2をリストに読込む。省略 9l2 = ['CNV_2nd_050_9','CNV_2nd_051_19','CNV_2nd_052_031M'] 10# 'sample1':'CNV_2nd_050_9'のカタチの辞書にする 11dic = {'sample{}'.format(i+1):v for i,v in enumerate(l2)} 12print(dic) 13 14# 'sample1' -> 'CNV_2nd_050_9'に置き換える 15def toSample(row): 16 sample_name = row['sample_name'] 17 if sample_name in dic: 18 row['sample_name'] = dic[sample_name] 19 return row 20 21df = df.apply(toSample,axis=1) 22print(df) 23""" 24 sample_name 250 CNV_2nd_050_9 261 CNV_2nd_052_031M 272 NaN 283 CNV_2nd_050_9 29"""

投稿2018/11/26 08:43

can110

総合スコア38352

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

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

ars_lon

2018/11/28 03:55

ご回答ありがとうございます。やはり、対応づけが必要ですよね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問