Pandas新列作为字符串提取另一个仅针对字符串长度的特定条件验证:快速方式

时间:2016-11-03 14:29:04

标签: python pandas dataframe

我正在使用大型df(接近2百万行),需要从另一个创建一个新列。这个任务看起来很简单:名为“PTCODICEFISCALE”的起始列包含一个由11个16个字符组成的字符串,没有其他可能性,没有NaN。 我必须创建的新列(“COGNOME”)必须包含“PTCODICEFISCALE”的3个第一个字符,只要“PTCODICEFISCALE”第n行的长度为16;否则,当长度为11时,新列应该不包含任何内容,这意味着“NaN”。

我试过这个:

csv.loc[len(csv['PTCODICEFISCALE']) == 16, 'COGNOME'] = csv.loc[csv.PTCODICEFISCALE.str[:3]]

在输出中出现此错误消息:

ValueError: cannot index with vector containing NA / NaN values

我不明白。 我确信“PTCODICEFISCALE”栏目中没有NA / NaN。

有任何帮助吗?谢谢!

P.S。:“csv”是DataFrame的名称

1 个答案:

答案 0 :(得分:3)

我认为您需要numpy.where并且条件为str.len

csv['COGNOME'] = np.where(csv.PTCODICEFISCALE.str.len() == 16, csv.PTCODICEFISCALE.str[:3], np.nan)

样品:

csv = pd.DataFrame({'PTCODICEFISCALE':['0123456789123456','1','01234567891234']})
print (csv)
    PTCODICEFISCALE
0  0123456789123456
1                 1
2    01234567891234

csv['COGNOME'] = np.where(csv.PTCODICEFISCALE.str.len() == 16, csv.PTCODICEFISCALE.str[:3], np.nan)

print (csv)
    PTCODICEFISCALE COGNOME
0  0123456789123456     012
1                 1     NaN
2    01234567891234     NaN