熊猫数据框可以有列表的dtype吗?

Posted

技术标签:

【中文标题】熊猫数据框可以有列表的dtype吗?【英文标题】:Can pandas dataframe have dtype of list? 【发布时间】:2017-01-13 17:04:50 【问题描述】:

我是 Pandas 的新手,我处理一个数据集,其中一列是带有管道 (|) 分隔值的字符串。现在我的任务是删除此 | 分隔字段中不符合某些条件的任何文本。

我的幼稚方法是逐行迭代数据框并将字段分解为列表并以这种方式进行验证。然后将修改后的行写回原始数据帧。请参阅此元样本:

for index, row in dataframe.iterrows():
    fixed = [x[:29] for x in row['field'].split('|')]
    dataframe.loc[index, 'field'] = "|".join(fixed)

有没有更好,更重要的是更快的方法来做到这一点?

【问题讨论】:

乍一看,这在我看来只是对数据结构的滥用。为什么有一列是由分隔符分隔的字段列表?其他列是什么? 您能否提供该列或数据框的任何示例? @juanpa.arrivillaga 好吧,这就是我在 CSV 中获得数据的方式。还有其他列,但这是唯一具有类似列表结构的列。关键是,在我收到的原始数据中,有时其中一个值是错误的......我需要在进一步处理数据集之前将其过滤掉 @AntonProtopopov 这有点微不足道...拿这个样本:pandas.DataFrame('ID' : [1,2,3,4],'FIELD' : ['aa|abc','bc|bb','c','d']) 要求是 FIELD 中的值不超过 2 个字符...所以必须过滤 ID 1 中的 abc出 @MichalHolub 最好将该示例附加到您的问题中。 【参考方案1】:

你可以使用的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

【讨论】:

以上是关于熊猫数据框可以有列表的dtype吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中仅针对 dtype bool 列将 True 和 False 映射为“是”和“否”?

熊猫将空的对象列添加到数据框[重复]

根据字符串列表过滤熊猫中的数据框

创建具有不相等值列表的熊猫数据框

如何从数据框熊猫中制作列表列表?

熊猫数据框到 json 列表格式