Python 查看列中的值在数据帧中是否包含%

Python 查看列中的值在数据帧中是否包含%,python,escaping,substring,multiple-columns,Python,Escaping,Substring,Multiple Columns,我有一个dataframe,它的列的值包含%(文字百分比符号)。我正在尝试创建一个函数来自动将这些值转换为十进制 例如,使用以下数据帧: var1 var2 var3 var4 id 0 1.4515 1.52% -0.5709 4% 1 1.57 1.605% -0.012 8% 2 1.

我有一个dataframe,它的列的值包含%(文字百分比符号)。我正在尝试创建一个函数来自动将这些值转换为十进制

例如,使用以下数据帧:

       var1        var2      var3     var4
id                                              
0    1.4515       1.52%    -0.5709    4%
1    1.57         1.605%   -0.012     8%
2    1.69253      1.657%   -0.754     9%
3    1.66331      1.686%   -0.0012    5%
4    1.739        1.716%   -0.04      12%
5    1.7447       1.61%    -0.0023    11%


def pct_to_dec(df):
    for col in df:
        print(col)
        if '%%' in df[col].astype(str):
            print(col)
            df[col] = df[col].replace({'%%':''}, regex=True)
            df[col] = df[col]/100
该函数应打印var2和var4,并将两列中的值转换为十进制格式。通过故障排除,我发现python在执行以下代码时没有看到百分比字符:

df.isin(['%%'])
df['var2'].str.contains('%')
它打印一个“False”的数据帧

最后,我试着看看我是否使用了错误的转义字符。我试过%%、/%和\%。
我感兴趣的是看我是否走上了正确的道路,以及是否有一种更简单的方法来做我正在尝试做的事情。

您可以使用Series方法轻松地检查这一点。str.contains

它允许您检查序列中哪些行具有您传递的字符串。例如,如果运行此代码:

df.isin(['%%'])
df['var2'].str.contains('%')
您将得到一个系列作为返回,所有行都等于True。因此,您只需要实现for并获取具有真值的行的索引,然后执行任何您想要的操作


请注意,如果您的行不是str类型,您将得到NaN作为返回,因此请注意列的类型。

您也可以使用
.str.endswith
,如以下示例所示:

for col in df.select_dtypes('object'):
    indexer_percent= df[col].str.endswith('%')
    df.loc[indexer_percent, col]= df.loc[indexer_percent, col].str.strip('%')
    df[col]= df[col].astype('float32')
    df.loc[indexer_percent, col]/= 100.0
根据您的数据,这将导致:

       var1     var2    var3  var4
id                                
0   1.45150  0.01520 -0.5709  0.04
1   1.57000  0.01605 -0.0120  0.08
2   1.69253  0.01657 -0.7540  0.09
3   1.66331  0.01686 -0.0012  0.05
4   1.73900  0.01716 -0.0400  0.12
5   1.74470  0.01610 -0.0023  0.11
数据由以下人员创建:

import pandas as pd
import io

infile=io.StringIO(
"""id var1        var2      var3     var4
0    1.4515       1.52%    -0.5709    4%
1    1.57         1.605%   -0.012     8%
2    1.69253      1.657%   -0.754     9%
3    1.66331      1.686%   -0.0012    5%
4    1.739        1.716%   -0.04      12%
5    1.7447       1.61%    -0.0023    11%"""
)

df= pd.read_csv(infile, index_col=0, sep='\s+')
请提供a,以及当前和预期输出。