我有一个字典列表,这些字典已经使用json_normalize转换成数据格式。
数据集:
x = [{
"_id" : 71,
"Ids" : [
"10",
"59"
],
"roles" : [
"janitor", "mechanic", "technician"
]
}]Dataframe:
_id Ids roles
71 [10, 59] [janitor, mechanic, technician]我想要做的是找到一种方法,在不显式键入列名的情况下,动态地爆炸所有列表列/键( is和角色)。这个是可能的吗?
期望输出:
_id Ids roles
71 10 janitor
71 10 mechanic
71 10 technician
71 59 janitor
71 59 mechanic
71 59 technician如能提供任何协助,将不胜感激。
发布于 2021-02-19 10:18:49
我不确定这样做的效率,但它只是遍历dataframe列名并检查它是否为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发布于 2021-02-19 10:36:58
一个简单的解决方案,遍历所有条目,检查列表。
适用于多行条目和嵌套列表。
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发布于 2021-02-19 10:20:48
我会这样做:
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)https://stackoverflow.com/questions/66275554
复制相似问题