54290


タイトルの通り、DataFrame内の特定の文字列を含む箇所だけ変換したいと思っております。  
以下の画像のデータ例にある「<」を含む箇所の数値だけを変換したいです。  
変換は「<」を取り除くのに加えて型変換を行い（strからfloatに変換）、「<」があった箇所のみ半分の値（1/2）にしたいと考えています。  
`.str.contains('<')`といった形で指定しようとは思っているのですが、うまく`str.strip()`などと組み合わせる方法がわかりません。  
同じ範囲を選択したまま処理することは可能でしょうか？

何度か繰り返すことになるので、関数として作成しようかと思っています。

[![データ例](https://i.stack.imgur.com/u7x7x.png)](https://i.stack.imgur.com/u7x7x.png)

現在のコード↓

[code]

    file="～.csv"
    data = pd.read_csv(file)
    data1 = data.drop(0,axis=0) #Remove DESCRIPTION
    data1 = data1['Au*'].str.strip('<')
    
[/code]

ご助力いただけませんでしょうか？


CC BY-SA 4.0
2019-04-17T03:02:11.727
54235
2019-04-18T11:27:55.817
30590
question
python pandas
DataFrame内の特定の文字列を含む箇所だけ変換したい


`.str.replace` でいかがでしょうか。

[code]

    .str.replace('<', '')
    
[/code]


CC BY-SA 4.0
2019-04-17T05:00:26.243
54240
2019-04-17T05:00:26.243
7754
54235
answer


自己解決しました。  
DataFrame全体ではなく、1つ1つの中身をifで判別して、該当する箇所だけ置換および半分にする処理をしました。

他に良い方法があるようなら回答お待ちしております。

[code]

    for i in range(1,len(data1["Au*"])+1):
        if "<" in data1.loc[i,"Au*"]:
            data1.loc[i,"Au*"]=float(data1.loc[i,"Au*"].replace('<',''))/2
        else:
            data1.loc[i,"Au*"]=float(data1.loc[i,"Au*"])
    
[/code]


CC BY-SA 4.0
2019-04-17T07:18:07.277
54248
2019-04-17T08:08:17.833
2019-04-17T08:08:17.833
30590
30590
54235
answer


どれだけ効率が変わるかはちょっとわかりませんが、以下のようにすると、やりたいことはできそうです。

[code]

    import pandas as pd
    
    
    s = pd.Series({'GH101': '0.2', 'GH102': '<0.02', 'GH103': '<0.02'})
    s
    
    df = s.to_frame('value')
    print(df)
    print('---')
    
    df = df.assign(
        fixed=df['value'],
        small=df['value'].str.contains('^<'),
    )
    print(df)
    print('---')
    
    df.loc[df['small'], 'fixed'] = pd.to_numeric(df[df['small']]['value'].str.replace('<', '')) / 2
    print(df)
    print('---')
    
    print(df[['value', 'fixed']])
    
[/code]

出力

[code]

           value
    GH101    0.2
    GH102  <0.02
    GH103  <0.02
    ---
           value  fixed  small
    GH101    0.2    0.2  False
    GH102  <0.02  <0.02   True
    GH103  <0.02  <0.02   True
    ---
           value fixed  small
    GH101    0.2   0.2  False
    GH102  <0.02  0.01   True
    GH103  <0.02  0.01   True
    ---
           value fixed
    GH101    0.2   0.2
    GH102  <0.02  0.01
    GH103  <0.02  0.01
    
[/code]


CC BY-SA 4.0
2019-04-18T11:27:55.817
54290
2019-04-18T11:27:55.817
754
54235
answer