首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Pandas中的字符串列表爆炸为单个列表而不丢失数据点的顺序

如何将Pandas中的字符串列表爆炸为单个列表而不丢失数据点的顺序
EN

Stack Overflow用户
提问于 2021-01-27 17:25:52
回答 2查看 191关注 0票数 1

由于Redshift不支持list []数据类型,所以我在Redshift中将一些整数值存储为字符串列表(Varchar类型)。现在,为了某种分析目的,我需要将字符串列表(包含整数值)转换为一维int数组。

样本数据:

代码语言:javascript
复制
dummy_df = pd.DataFrame({'customer_id':[1,2,3],'values':[['[1]','[1,8]'],['[3,7]','[3]'],'[5]'] })
print(dummy_df)

产出数据:

代码语言:javascript
复制
final_df = pd.DataFrame({'customer_id':[1,2,3],'values':[[1,1,8],[3,7,3],[5]] })
final_df

注意: DataFrame dummy_df值-列是字符串的列表。

EN

回答 2

Stack Overflow用户

发布于 2021-01-27 17:30:05

尝试(希望能够自我解释)下面的代码:

代码语言:javascript
复制
dummy_df['values'] = (dummy_df['values'].explode()     # flatten the list structure
                          .str.extractall('(\d+)')     # extract the digits
                          .astype(int)                 # convert to int
                          .groupby(level=0).agg(list)  # aggregate the list
                     )

print(dummy_df.to_dict('list'))

输出:

代码语言:javascript
复制
{'customer_id': [1, 2, 3], 'values': [[1, 1, 8], [3, 7, 3], [5]]}
票数 2
EN

Stack Overflow用户

发布于 2021-01-27 17:34:34

一种缓慢应用的方法是将这些字符串按顺序排列到列表,然后进行求和。

代码语言:javascript
复制
import ast

dummy_df['values'] = dummy_df['values'].explode().apply(ast.literal_eval).sum(level=0)

   customer_id     values
0            1  [1, 1, 8]
1            2  [3, 7, 3]
2            3        [5]

不管怎么说,熊猫复杂的物体操作效果相当差。@QuangHoang的方法稍快一些。

代码语言:javascript
复制
import perfplot
import pandas as pd
import numpy as np
import ast


def quang(df):
    return (df['values'].explode()              # flatten the list structure
               .str.extractall('(\d+)')         # extract the digits
               .astype(int)                     # convert to int
               .groupby(level=0).agg(list))[0]  # aggregate the list
           
    
def alollz(df):
    return df['values'].explode().apply(ast.literal_eval).sum(level=0)



perfplot.show(
    setup=lambda n: pd.concat([pd.DataFrame({'customer_id':[1,2,3],
                                             'values':[['[1]','[1,8]'], ['[3,7]','[3]'], '[5]']})]*n,
                              ignore_index=True), 
    kernels=[
        lambda df: quang(df),
        lambda df: alollz(df),
    ],
    labels=['str.extract', 'ast.literal_eval'],
    n_range=[2 ** k for k in range(1, 16)],
    equality_check=lambda x,y: x.compare(y).empty,
    xlabel='~len(df)'
)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65924241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档