IIUC你可以使用:
dataframe = pd.DataFrame({'field':['aasd|bbuu|cccc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'],
'G':[4,5,6]})
print (dataframe)
G field
0 4 aasd|bbuu|cccc|ddde|e
1 5 ffff|gggg|hhhh|i|j
2 6 cccc|u|k
print (dataframe.field.str.split('|', expand=True)
.stack()
.str[:2] #change to 29
.groupby(level=0)
.apply('|'.join))
0 aa|bb|cc|dd|e
1 ff|gg|hh|i|j
2 cc|u|k
dtype: object
另一种解决方案通过列表理解:
dataframe['new'] = pd.Series([[x[:2] for x in y] for y in dataframe.field.str.split('|')],
index=dataframe.index)
.apply('|'.join)
print (dataframe)
G field new
0 4 aasd|bbuu|cccc|ddde|e aa|bb|cc|dd|e
1 5 ffff|gggg|hhhh|i|j ff|gg|hh|i|j
2 6 cccc|u|k cc|u|k
dataframe = pd.DataFrame({'field':['aasd|bbuu|cc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'],
'G':[4,5,6]})
print (dataframe)
G field
0 4 aasd|bbuu|cc|ddde|e
1 5 ffff|gggg|hhhh|i|j
2 6 cccc|u|k
如果需要过滤器值不再作为2
所有值:
s = dataframe.field.str.split('|', expand=True).stack()
print (s)
0 0 aasd
1 bbuu
2 cc
3 ddde
4 e
1 0 ffff
1 gggg
2 hhhh
3 i
4 j
2 0 cccc
1 u
2 k
dtype: object
dataframe['new'] = s[s.str.len() < 3].groupby(level=0).apply('|'.join)
print (dataframe)
G field new
0 4 aasd|bbuu|cc|ddde|e cc|e
1 5 ffff|gggg|hhhh|i|j i|j
2 6 cccc|u|k u|k
另一种解决方案:
dataframe['new'] = pd.Series([[x for x in y if len(x) < 3] for y in dataframe.field.str.split('|')],
index=dataframe.index)
.apply('|'.join)
print (dataframe)
G field new
0 4 aasd|bbuu|cc|ddde|e cc|e
1 5 ffff|gggg|hhhh|i|j i|j
2 6 cccc|u|k u|k
在乍一看,这似乎只是对我来说,数据结构的滥用。为什么有一列是由分隔符分隔的字段列表?其他栏目是什么? –
您能否提供该列或数据框的任何示例? –
@ juanpa.arrivillaga好吧,这就是数据在CSV中的表现。还有其他一些列,但这是唯一一个具有列表结构的列。关键是,在我看到的原始数据中,有时候这些值中的一个是错误的......我需要将其过滤掉,然后再继续处理数据集 –