我有以下来自 API 源的数据帧,我试图整理数据,同时不大量更改我的原始数据帧(本质上不想做笛卡尔积)
data = ["[['Key','Metric','Value'],['foo','bar','4'],['foo2','bar2','55.21']]",
"[['Key','Metric','Value'],['foo','bar','5']]",
"[['Key','Metric','Value'],['foo','bar','6'],['foo1','bar1',''],['foo2','bar2','57.75']]"]
df = pd.DataFrame({'id' : [0,1,2],'arr' : data})
print(df)
id arr
0 0 [['Key','Metric','Value'],['foo','bar','4'],['...
1 1 [['Key','Metric','Value'],['foo','bar','5']]
2 2 [['Key','Metric','Value'],['foo','bar','6'],['...
Key
Value
Metric
告诉我想要做的数组的顺序是以字典的方式对其进行排序{key : value},其中键是连接的 Key
和 Metric
字段,值是嵌套列表的 -1
索引。
源数据是通过 Excel 和 MS Graph API 提供的,我不认为它会改变,但可能会改变,所以我正在尝试提出一个动态解决方案。
我的目标数据框是:
target_df = pd.DataFrame({'id' : [0,1,2],
'foo_bar' : [4,5,6],
'foo1_bar1' : [np.nan, np.nan,''],
'foo2_bar2' : [55.21, np.nan, 57.75]})
print(target_df)
id foo_bar foo1_bar1 foo2_bar2
0 0 4 NaN 55.21
1 1 5 NaN NaN
2 2 6 57.75
我自己的尝试是使用 ast
库中的literal_eval 来获取第一个列表,该列表始终是Key
Metric
& Value
列 - 将来可能会有一个 Key
Metric
、 Metric2
、 Value
字段 -因此我希望保持事物的动态。
总会有一个Key
和Value
字段。
自己的尝试:
from ast import literal_eval
literal_eval(df['arr'][0])[0]
#['Key', 'Value', 'Metric']
用这个我替换了列表字符并用 分割,
然后将结果转换为数据帧:
df['arr'].str.replace('\[|\]','').str.split(',',expand=True)
然而,在此之后我还没有明确的进展,并想知道我是否以错误的方式处理这件事?
最佳答案
尝试:
df2=df["arr"].map(eval).apply(lambda x: pd.Series({f"{el[0]}_{el[1]}": el[2] for el in x[1:]}))
df2["id"]=df["id"]
输出:
foo_bar foo2_bar2 foo1_bar1 id
0 4 55.21 NaN 0
1 5 NaN NaN 1
2 6 57.75 2
关于python - 将字符串化列表的列表转换为数据帧,同时维护索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794852/