首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas中的列表列动态爆炸

Pandas中的列表列动态爆炸
EN

Stack Overflow用户
提问于 2021-02-19 10:10:11
回答 3查看 148关注 0票数 0

我有一个字典列表,这些字典已经使用json_normalize转换成数据格式。

数据集:

代码语言:javascript
复制
x = [{ 
    "_id" : 71, 
    "Ids" : [
        "10", 
        "59"
    ], 
    "roles" : [
        "janitor", "mechanic", "technician"
    ]
}]

Dataframe:

代码语言:javascript
复制
   _id       Ids                            roles
    71  [10, 59]  [janitor, mechanic, technician]

我想要做的是找到一种方法,在不显式键入列名的情况下,动态地爆炸所有列表列/键( is和角色)。这个是可能的吗?

期望输出:

代码语言:javascript
复制
   _id       Ids         roles
    71        10       janitor
    71        10      mechanic
    71        10    technician
    71        59       janitor
    71        59      mechanic
    71        59    technician

如能提供任何协助,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-19 10:18:49

我不确定这样做的效率,但它只是遍历dataframe列名并检查它是否为list。如果是list,那就叫explode

代码语言:javascript
复制
df_final = df.copy()

for c in df.columns:
    if(isinstance(df[c][0],list)):
        df_final = df_final.explode(c)
代码语言:javascript
复制
    _id Ids roles
0   71  10  janitor
0   71  10  mechanic
0   71  10  technician
0   71  59  janitor
0   71  59  mechanic
0   71  59  technician
票数 2
EN

Stack Overflow用户

发布于 2021-02-19 10:36:58

一个简单的解决方案,遍历所有条目,检查列表。

适用于多行条目和嵌套列表。

代码语言:javascript
复制
    while True:
        newdf = pd.DataFrame(columns=df.columns)
        for row in df.values:
            for index, value in enumerate(row):
                if isinstance(value, list):
                    for listentry in value:
                        newdf.loc[len(newdf)] = [*row[:index], listentry, *row[index+1:]] 
                    break
            else:
                newdf.loc[len(newdf)] = row
        df = newdf.copy(deep=True)
        if not newdf.applymap(lambda value:isinstance(value, list)).values.any():
            break
票数 1
EN

Stack Overflow用户

发布于 2021-02-19 10:20:48

我会这样做:

代码语言:javascript
复制
from itertools import product

list_ = [df.iloc[0,i] if type(df.iloc[0,i]) == list else [df.iloc[0,i]] for i in range(df.shape[1])]
prod = list(product(*list_))
df = pd.DataFrame(prod, columns=df.columns)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66275554

复制
相关文章

相似问题

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