Превратить два списка понимания в один? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать словарь table_data из фрейма данных Pandas, как показано ниже:

import pandas as pd

d = {
    'Name': ['John', 'Tom', 'Jack', 'Jill'],
    'Age': [42, 53, 18, 22],
    'City': ['London', 'New York', 'Bangkok', 'Warsaw']
}

df = pd.DataFrame(d)

table_data = dict(
        headers = [[header] for header in list(df)],
        columns = [df[header].tolist() for header in list(df)],
)

print(table_data)

Есть ли способ избежать повторения итераций list(df) дважды и превратить эти два понимания списка в одно?Или это противоречит цели понимания списка, и я должен использовать вместо этого простой старый цикл for, вот так?:

import pandas as pd

d = {
    'Name': ['John', 'Tom', 'Jack', 'Jill'],
    'Age': [42, 53, 18, 22],
    'City': ['London', 'New York', 'Bangkok', 'Warsaw']
}

df = pd.DataFrame(d)

headers = []
columns = []
table_data = {
    'headers': headers,
    'columns': columns,
}
for header in list(df):
    table_data['headers'].append([header])
    table_data['columns'].append(df[header].tolist())

print(table_data)   

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Примерно так:

header = [list(df.columns.values)]
values = df.values.T
table_data = dict(headers=header, columns=values)
0 голосов
/ 05 февраля 2019

Да, это возможно, сначала создав кортежи, затем zip и преобразовав кортежи в списки:

L = [([header],df[header].tolist())  for header in list(df)]
h, c = zip(*L)

table_data = dict(
        headers = list(h),
        columns = list(c),
)

Решение без петель:

table_data = dict(
        headers = df.columns.to_frame().values.tolist(),
        columns = df.T.values.tolist(),
)
print(table_data)
...