【问题标题】:Turn two lists comprehensions into one?将两个列表理解合二为一?
【发布时间】:2019-02-05 17:02:41
【问题描述】:

我正在尝试从 Pandas 数据框创建 table_data 字典,如下所示:

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)   

【问题讨论】:

  • 您不需要list(df),只需使用df。转换似乎没用,可能需要时间。

标签: python pandas dataframe list-comprehension


【解决方案1】:

类似这样的:

header = [list(df.columns.values)]
values = df.values.T
table_data = dict(headers=header, columns=values)

【讨论】:

  • +1:虽然列表推导是原生 Python 中的优秀工具,但如果您发现自己在使用 Pandas、Numpy 等时编写了很多列表推导式,那么您可能会错过使用这些库的意义。
【解决方案2】:

是的,可以先创建元组,然后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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多