67061


Pandasで条件に当てはまる列だけ同じ変換を施したく、以下のコードを書いていますが  
can't assign to function callのSyntax Errorが出てしまいます。

[code]

    df.str.contains("x") = df.str.contains("x").apply(lambda x: 1 if x == 1 else 0)
    
[/code]

どう改良すればよろしいでしょうか？  
よろしくお願いいたします。


CC BY-SA 4.0
2020-05-25T01:07:35.493
66954
2020-07-12T08:48:04.830
2020-05-28T21:36:36.197
12457
12457
question
python pandas
Pandasで条件に当てはまる列だけ同じ変換をしたい


条件は、「文字列"x"がカラム名に含まれる場合、そのカラムの値がもし1でなければ0を代入する」という内容でしょうか。

[code]

    import pandas as pd
    
    df = pd.DataFrame({
        "colx": [1,2,3],
        "coly": [4,5,6],
        "colz": [7,8,9],
    })
    
    
    # AS-IS:
    # |    |   colx |   coly |   colz |
    # |---:|-------:|-------:|-------:|
    # |  0 |      1 |      4 |      7 |
    # |  1 |      2 |      5 |      8 |
    # |  2 |      3 |      6 |      9 |
    #
    # TO-BE:
    # colx の index1と2の値が0に変わる
    # |    |   colx |   coly |   colz |
    # |---:|-------:|-------:|-------:|
    # |  0 |      1 |      4 |      7 |
    # |  1 |      0 |      5 |      8 |
    # |  2 |      0 |      6 |      9 |
    
    # 1. カラム毎にループ
    for col in df:
    
        # 2. もし文字列"x"がカラム名に含まれる場合
        if "x" in col:
    
            # 3. そのカラムの値が1でなければ0を代入する
            df.loc[:, col] = df.loc[:, col].apply(lambda x: 1 if x == 1 else 0)
    
[/code]

* * *

`str`アクセサは値に対する条件のため、以下のようなときに使います：

[code]

    df = pd.DataFrame({
        "colx": ["one", "two", "three"],
        "coly": ["four", "five", "six"],
        "colz": ["seven", "eight", "nine"],
    })
    
    # AS-IS:
    # |    | colx   | coly   | colz   |
    # |---:|:-------|:-------|:-------|
    # |  0 | one    | four   | seven  |
    # |  1 | two    | five   | eight  |
    # |  2 | three  | six    | nine   |
    #
    # TO-BE:
    # 値に"t"が含まれる場合、その値を"X"にする。
    # |    | colx   | coly   | colz   |
    # |---:|:-------|:-------|:-------|
    # |  0 | one    | four   | seven  |
    # |  1 | X      | five   | X      |
    # |  2 | X      | six    | nine   |
    
    
    for col in df:
        df.loc[df[col].str.contains("t"), col] = "X"
    
[/code]

参考：  
\- <https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.str.contains.html>


CC BY-SA 4.0
2020-05-28T02:09:38.280
67061
2020-05-28T02:09:38.280
26558
66954
answer


条件を `loc` に指定して当てはまる列を抽出し、`applymap` で変換します。

[code]

    df = pd.DataFrame({
        "colx": [0, 1, 2],
        "coly": [0, 1, 2],
        "colz": [0, 1, 2],
    })
    
    print(df)
    #    colx  coly  colz               
    # 0     0     0     0                                                                                                                                                                                                                                                             
    # 1     1     1     1
    # 2     2     2     2
    
    # columns containing "x"
    columns_x = df.columns.str.contains("x")
    
    # map to apply
    f = lambda x: 1 if x == 1 else 0
    
    df.loc[:, columns_x] = df.loc[:, columns_x].applymap(f)
    
    print(df)
    #    colx  coly  colz
    # 0     0     0     0
    # 1     1     1     1
    # 2     0     2     2
    
[/code]


CC BY-SA 4.0
2020-07-12T08:48:04.830
68516
2020-07-12T08:48:04.830
41038
66954
answer