Python 熊猫数据框可以有列表的数据类型吗?
我不熟悉Pandas,我处理一个数据集,其中一列是用管道(Python 熊猫数据框可以有列表的数据类型吗?,python,string,list,pandas,list-comprehension,Python,String,List,Pandas,List Comprehension,我不熟悉Pandas,我处理一个数据集,其中一列是用管道(|)分隔的字符串值。现在我的任务是删除这个|分隔字段中不符合特定条件的任何文本 我的天真方法是逐行迭代dataframe,并将字段分解为列表,并以这种方式进行验证。然后将修改后的行写回原始数据帧。请参见此元示例: for index, row in dataframe.iterrows(): fixed = [x[:29] for x in row['field'].split('|')] dataframe.loc[in
|
)分隔的字符串值。现在我的任务是删除这个|分隔字段中不符合特定条件的任何文本
我的天真方法是逐行迭代dataframe,并将字段分解为列表,并以这种方式进行验证。然后将修改后的行写回原始数据帧。请参见此元示例:
for index, row in dataframe.iterrows():
fixed = [x[:29] for x in row['field'].split('|')]
dataframe.loc[index, 'field'] = "|".join(fixed)
有没有更好、更重要、更快的方法可以做到这一点?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
如果需要使用长度为
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
s=dataframe.field.str.split(“|”),expand=True.stack()
印刷品
0 aasd
1 bbuu
2毫升
3 ddde
4 e
10 ffff
1 gggg
2小时
3我
4 j
20中国交建
1 u
2K
数据类型:对象
数据帧['new']=s[s.str.len()<3]。groupby(级别=0)。应用('|'.join)
打印(数据帧)
G场新
0 4 aasd | bbuu | cc | ddde | e cc | e
1 5 ffff | gggg | hhh | i | j i | j
2.6中国建筑股份有限公司
另一个解决方案:
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
dataframe['new']=pd.Series([[x表示y中的x,如果len(x)<3]表示y在dataframe.field.str.split('|')],
index=dataframe.index)
.apply(“|”.join)
打印(数据帧)
G场新
0 4 aasd | bbuu | cc | ddde | e cc | e
1 5 ffff | gggg | hhh | i | j i | j
2.6中国建筑股份有限公司
乍一看,这似乎是对数据结构的滥用。为什么列是由分隔符分隔的字段列表?其他列是什么?你能提供该列或数据框的任何示例吗?@juanpa.arrivillaga嗯,这就是我在CSV中获得数据的方式。还有其他列,但这是唯一具有类似列表结构的列。关键是,在我收到的原始数据中,有时这些值中的一个是错误的……在我进一步处理这些数据之前,我需要将其过滤掉dataset@AntonProtopopov这有点微不足道……以这个示例为例:pandas.DataFrame({'ID':[1,2,3,4],'FIELD':['aa | abc','bc | bb','c','d'])
要求字段中的值不超过2个字符……因此必须过滤ID 1中的abcout@MichalHolub最好把这个例子附在你的问题上。
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