下面的代码有效地将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
只出现在Col A
中X
下面的row
上。没有一个包含floats
?
applymap
将函数len
应用于数据帧的每个元素。由于浮点数没有长度,因此函数无法应用于它们。如果你仍然想知道它们的"长度",可以将它们转换为字符串:
df.iloc[:, 1:].astype(str).applymap(len)
但是,请注意,函数str
不能保证生成浮点的特定字符串表示。例如,len(str(5.0000))
是3,而不是您所期望的6。