合并熊猫 df 时出错。类型错误: ( "object of type 'float' has no len()" , '发生在索引 D 处')



下面的代码有效地将pandas dfrow中的所有值合并在任何4个字母的string之前。这仅适用于Col AX正下方的行。

df = pd.DataFrame({
'A' : ['X','Foo','No','','X','Big','No'],           
'B' : ['','Bar','Merge','','','Cat','Merge'],
'C' : ['','Fubu','XXXX','','','BgCt','YYYY'],                  
})
maskX = df.iloc[:,0].apply(lambda x: x=='X')
maskX.index += 1
maskX = pd.concat([pd.Series([False]), maskX])
maskX = maskX.drop(len(maskX)-1)
mask = (df.iloc[:, 1:].applymap(len) == 4).cumsum(1) == 0
for i,v in maskX.items():
mask.iloc[i,:] = mask.iloc[i,:].apply(lambda x: x and v)
df.A[maskX] = df.A + df.iloc[:, 1:][mask].fillna('').apply(lambda x: x.sum(), 1)
df.iloc[:, 1:] = df.iloc[:, 1:][~mask].fillna('')

除非df中有字符串以外的值,否则这种方法很好。因此,如果包含浮点或整数,它将向该列返回一个错误。例如

df = pd.DataFrame({
'A' : ['X','Foo','No','','X','Big','No'],           
'B' : ['','Bar','Merge','','','Cat','Merge'],
'C' : ['','Fubu','XXXX','','','BgCt','YYYY'],
'D' : ['','',1.0,2.0,3.0,'',''],                   
})
TypeError: ("object of type 'float' has no len()", 'occurred at index D')

我不太清楚为什么,因为merge只出现在Col AX下面的row上。没有一个包含floats

applymap将函数len应用于数据帧的每个元素。由于浮点数没有长度,因此函数无法应用于它们。如果你仍然想知道它们的"长度",可以将它们转换为字符串:

df.iloc[:, 1:].astype(str).applymap(len)

但是,请注意,函数str不能保证生成浮点的特定字符串表示。例如,len(str(5.0000))是3,而不是您所期望的6。

相关内容

最新更新