【发布时间】:2018-07-30 05:48:53
【问题描述】:
下面的代码有效地将pandas df row 中的所有值合并到任何4 个字母string 之前。这仅适用于Col A 中X 正下方的行。
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 仅出现在X 中X 下方的row 中Col A。没有一个包含floats?
【问题讨论】: