如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:

Posted

技术标签:

【中文标题】如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:【英文标题】:How to convert Python list into pandas DataFrame or excel file output with specific requirements as below: 【发布时间】:2022-01-22 00:17:00 【问题描述】:

我有以下来自 JSON 的列表:

list = ['select', 'name1 = a.column1', 'name2 = a.column2', 'name3 = a.[column3]',
        'from', 'xyz.[Table1$Name] c',
        'select', 'name2 = b.othercolumn1', 'name2 = b.[othercolumn2]', 'name3 = b.othercolumn3',
        'from', 'abc.[Table2$Name] d',
        'where', 'x.[TableX] = '123',++++ and so on.....]

我想要的输出是一个包含 2 列的数据框,我可以将其提取为 excel,如下所示:

Table Name         Column Name
Table1$Name        column1
Table1$Name        column2
Table1$Name        column3
Table2$Name        othercolumn1
Table2$Name        othercolumn2
Table2$Name        othercolumn3

我已经尝试了很多方法,但我无法实现所需的输出,我只想让这个“.bim”文件中的所有列针对相应的表进行 excel 文件输出,其他一切都像 where 语句,[] , c, a., b., 应在最终输出中删除。

【问题讨论】:

这看起来像是一个 sql 解析问题。在***.com/questions/68880439/…之前回答过类似的问题 您的 list 似乎包含许多拆分的 SQL SELECT 语句。您已经显示了两个(不正确的)琐碎的单表选择。您是否只有这样的琐碎选择,或者您的列表是否包含其他 sql 语句或多表选择? @SergeBallesta 我的列表包含许多“select”语句,然后是“from”语句。例如[“选择”、“列 1”、“从”、“表 1”、“哪里”、“abc=xyz”、“选择”、“abc1”、“abc2”、“abc3”、“从”、“表 2” , ++++ ... ... ]。我想要的输出只是作为 DataFrame 的表名和列名。 @RobRaymond 我已经在指定线程上查看了您的答案,但是,在我的情况下,它是不同的,不能用相同的方法解决。如果您能帮助我,那就太好了,因为自上周以来我一直在花时间寻找解决方案。谢谢你.. :) 这里有两种可能的方法。一种是加入列表的元素以构建真正的选择语句并在它们上使用 SQL 解析器。另一种是尝试直接使用元素本身,使用'select''from''where'作为分隔标记。要走的路取决于您的列表实际包含的内容:如果 SQL 语句正确,第一种方法应该更复杂但可能更健壮,第二种方法应该更简单,但如果列表仅限于琐碎的选择语句,则只是一种选择。由于您只显示垃圾,我不能说更多...... 【参考方案1】: 根据 cmets,您实际上是在问如何将 SQL 解析为它的组件 此方法使用lark进行解析。这是一个复杂的话题,因此已经演示了如何以另一种方式与 pandas 集成 根据我使用的语法,您的示例 SQL 无效。恕我直言,这是一个不错的 SQL 语法。我使用过许多数据库引擎,但我使用过的不是一个允许在 select 子句中赋值或在列名或表名中使用 $
from lark import Lark, Tree, Visitor, Tree, Token, UnexpectedInput
import requests
import pandas as pd

grammar = requests.get(
    "https://raw.githubusercontent.com/z***le/sql_to_ibis/main/sql_to_ibis/grammar/sql.lark"
).text
parser = Lark(grammar, start="query_expr")


class sqlparts(Visitor):
    __columns = []
    __tables = []

    def __init__(self):
        self.__columns = []
        self.__tables = []

    def column_name(self, tree):
        self.__columns += [
            tok.value
            for tok in tree.scan_values(
                lambda v: isinstance(v, Token) and v.type == "CNAME"
            )
        ]

    def table(self, tree):
        self.__tables += [
            tok.value
            for tok in tree.scan_values(
                lambda v: isinstance(v, Token) and v.type == "CNAME"
            )
        ]

    def data(self):
        return "columns": self.__columns, "tables": self.__tables


df = pd.DataFrame(
    
        "sql": [
            "select col1, col2, col3 from table1, table2 where col7=8",
            'select "hello" from a_long_table where col7=8',
            'select "hello" from a_long_table where col7=8 groupby col8',
            "select col$ from tables",
        ]
    
)


def applyparse(sql):
    d = sqlparts()
    try:
        t = parser.parse(sql, start="query_expr")
        d.visit(t)
        return d.data()
    except UnexpectedInput as e:
        return "error": e


df.join(df["sql"].apply(applyparse).apply(pd.Series))
sql columns tables error
select col1, col2, col3 from table1, table2 where col7=8 ['col7', 'col1', 'col2', 'col3'] ['table1', 'table2'] nan
select "hello" from a_long_table where col7=8 ['col7'] ['a_long_table'] nan
select "hello" from a_long_table where col7=8 groupby col8 ['col7', 'col8'] ['a_long_table'] nan
select col$ from tables nan nan No terminal matches '$' in the current parser context, at line 1 col 11

【讨论】:

以上是关于如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中使用pandas将字典列表转换为数据框[重复]

如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:

如何将熊猫中的一列列表转换为Python中唯一值的稀疏DataFrame [重复]

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

Python 如何将该列表转换成excel表格?

如何使用 PANDAS / Python 将矩阵转换为列数组