有条件地替换Pandas列中的字符串

时间:2018-12-10 19:46:34

标签: python pandas

在我的Pandas DataFrame中,“ naics”列之一包含NAICS代码,例如311、311919、3159、331、332、332913。

我想用相同的两位数字替换所有以两位数字开头的代码。例如,如果值是311、311919、3159或任何其他以31开头的字符串(这些字符串需要保留字符串,而不是int),则我希望新值是31。

我尝试了以下形式的变化:

df.naics.loc[(df['naics'] == '^31')] = '31'

但是我尝试过的每个变化都不会产生影响(并且都不会引发错误)。

有什么建议吗?

谢谢

Jarod

5 个答案:

答案 0 :(得分:2)

您可以使用str访问器:

设置:

df = pd.DataFrame({'naics':['311', '311919', '3159', '331', '332', '332913']})
>>> df
    naics
0     311
1  311919
2    3159
3     331
4     332
5  332913

使用str的解决方案:

df['code'] = df.naics.str[:2]

>>> df
    naics code
0     311   31
1  311919   31
2    3159   31
3     331   33
4     332   33
5  332913   33

答案 1 :(得分:2)

只需稍微更改一下代码,如果列的类型为object,就不需要astype(str)

df.loc[df['naics'].astype(str).str[:2] == '31', 'naics'] = '31'


naics
0   31
1   31
2   31
3   331
4   332
5   332913

答案 2 :(得分:2)

使用startswith

df.loc[df.naics.str.startswith('31'),'naics']='31'
df
Out[1272]: 
    naics
0      31
1      31
2      31
3     331
4     332
5  332913

答案 3 :(得分:0)

您可以尝试这个:)

import pandas as pd
df = pd.DataFrame({'naics':['311', '311919', '3159', '331', '332', '332913']})
df['code'] = df2.naics.apply(lambda s : s[:2])
df

答案 4 :(得分:0)

将原始格式提供给Vaishali。这是一个更通用的功能:

def str_replace(df, s, short, col, term): 
    df.loc[s.str.contains('|'.join([short])), col] = term
    return df 

此处将数据帧(df)发送到函数,特定系列(s),要捕获的字符串的简短版本,列(col)名称以及要替换的术语。然后返回数据框。

我也可以使用两个等长列表压缩在一起的循环来迭代地执行此操作;剪下捕获术语的列表,并删去新术语的列表。

df = [str_replace( df, s, sh, col, t) for sh,t in zip(shrt,trm)]

请牢记最初的问题,请记住仅起始数字的条件,

  

df.naics.loc [(df ['naics'] =='^ 31')] ='31'

这是我所拥有的:

import pandas as pd
df = pd.DataFrame({'naics':['311', '311919', '3159', '331', '332', '332913']})

def str_replace2(df, s, col, term): 
    df.loc[s.astype(str).str[:2] == term, col] = term
    return df

df = str_replace2(df, df.naics, 'naics', '31')