动态分解Pandas中的列表列

2024-09-28 21:03:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用json_normalize转换成数据帧的字典列表

数据集:

x = [{ 
    "_id" : 71, 
    "Ids" : [
        "10", 
        "59"
    ], 
    "roles" : [
        "janitor", "mechanic", "technician"
    ]
}]

数据帧:

   _id       Ids                            roles
    71  [10, 59]  [janitor, mechanic, technician]

我试图做的是找到一种方法,在不显式键入列名的情况下动态分解所有列表列/键(ID和角色)。这可能吗

所需输出:

   _id       Ids         roles
    71        10       janitor
    71        10      mechanic
    71        10    technician
    71        59       janitor
    71        59      mechanic
    71        59    technician

任何协助都将不胜感激


Tags: 数据方法idjsonids列表键入字典
3条回答

我不确定这是否有效,但它只是在数据帧列名上迭代并检查它是否为list。如果它是list,则只需explode

df_final = df.copy()

for c in df.columns:
    if(isinstance(df[c][0],list)):
        df_final = df_final.explode(c)
    _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

我会这样做:

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)

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

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

    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

相关问题 更多 >