查看列中的值是否包含 pandas 数据框中的 %

See if the values in a column contain % in a pandas 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(['%%'])

它打印了一个“False”的数据帧。

最后,我尝试查看是否使用了错误的转义字符。我试过 %%、/% 和 \%。 我很想知道我是否在正确的轨道上,以及是否有更简单的方法来完成我想做的事情。

您可以使用系列方法轻松检查。str.contains

它可以让您检查系列中的哪些行具有您传递的字符串。例如,如果您 运行 此代码:

df['var2'].str.contains('%')

您将得到一个 return 系列,其中所有行都为 True。所以你只需要实现一个 for 并获取具有 True 值的行的索引,然后做任何你想做的事。

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

您也可以像下面的例子一样使用.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+')