Eu tenho o seguinte quadro de dados vindo de uma fonte de API, estou tentando organizar os dados, embora não altere maciçamente meu quadro de dados original (não quero fazer um produto cartesiano essencialmente)
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'],['...
O Key
Value
Metric
informa a ordem dos arrays dentro do que estou tentando fazer é ordená-lo em um dicionário de {chave: valor} onde a chave é o Key
& Metric
campos unidos e o valor é o -1
índice da lista aninhada.
Os dados de origem vêm do Excel e da API do MS Graph, não imagino que isso vá mudar, mas pode, então estou tentando encontrar uma solução dinâmica.
meu dataframe de destino é:
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
minhas próprias tentativas têm sido usar literal_eval da ast
biblioteca para obter a primeira lista que será sempre o Key
Metric
& Value
coluna - lá talvez, no futuro, um Key
Metric
, Metric2
, Value
campo - daí o meu desejo de manter as coisas dinâmico.
sempre haverá um único campo Key
& Value
.
from ast import literal_eval
literal_eval(df['arr'][0])[0]
#['Key', 'Value', 'Metric']
com isso, substituí os caracteres da lista e dividi ,
então converti o resultado em um dataframe:
df['arr'].str.replace('\[|\]','').str.split(',',expand=True)
no entanto, depois disso, não deixei muito claro o que fazer e me pergunto se estou fazendo isso da maneira errada?
Experimentar:
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"]
Resultado:
foo_bar foo2_bar2 foo1_bar1 id
0 4 55.21 NaN 0
1 5 NaN NaN 1
2 6 57.75 2
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras