Python 熊猫数据框可以有列表的数据类型吗?

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

我不熟悉Pandas,我处理一个数据集,其中一列是用管道(
|
)分隔的字符串值。现在我的任务是删除这个|分隔字段中不符合特定条件的任何文本

我的天真方法是逐行迭代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