【问题标题】:Error when merging pandas df. TypeError: ("object of type 'float' has no len()", 'occurred at index D')合并 pandas df 时出错。 TypeError:(“'float'类型的对象没有len()”,'发生在索引D')
【发布时间】:2018-07-30 05:48:53
【问题描述】:

下面的代码有效地将pandas df row 中的所有值合并到任何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 仅出现在XX 下方的rowCol A。没有一个包含floats

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多