在我的Pandas DataFrame中,“ naics”列之一包含NAICS代码,例如311、311919、3159、331、332、332913。
我想用相同的两位数字替换所有以两位数字开头的代码。例如,如果值是311、311919、3159或任何其他以31开头的字符串(这些字符串需要保留字符串,而不是int),则我希望新值是31。
我尝试了以下形式的变化:
df.naics.loc[(df['naics'] == '^31')] = '31'
但是我尝试过的每个变化都不会产生影响(并且都不会引发错误)。
有什么建议吗?
谢谢
Jarod
答案 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')