查看列中的值是否包含 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+')
我有一个数据框,其中的列的值包含 %(百分号)。我正在尝试创建一个函数来自动将这些值转换为小数。
例如,使用以下数据框:
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+')