【问题标题】:What is the simplest way to convert a Dataset object to a Pandas DataFrame?将 Dataset 对象转换为 Pandas DataFrame 的最简单方法是什么?
【发布时间】:2018-10-04 00:01:01
【问题描述】:

Python Dataset module 基于 Sqlalchemy 并公开了一个函数来返回名为 all() 的表中的所有记录。 all() 返回一个可迭代的 Dataset 对象。

users = db['user'].all()

for user in db['user']:
   print(user['age'])

将 Dataset 对象转换为 Pandas DataFrame 对象的最简单方法是什么?

为了清楚起见,我有兴趣利用 Dataset 的功能,因为它已经将表加载到 Dataset 对象中。

【问题讨论】:

    标签: python dataframe orm sqlalchemy dataset


    【解决方案1】:

    这对我有用:

    import dataset
    import pandas
    db = dataset.connect('sqlite:///db.sqlite3')
    data = list(db['my_table'].all())
    dataframe = pandas.DataFrame(data=data)
    

    【讨论】:

    • 我会检查并报告。
    【解决方案2】:

    我创建了一些帮助函数,可以让这个过程更加简单:

    import dataset
    import pandas as pd
    
    def df_dataset_save(df, table_name, db_name='db'):
        try:
            df = df.to_dict(orient='records')
            db = dataset.connect('sqlite:///' + db_name + '.sqlite')
            table = db[table_name]
            table.insert_many(df)
            return 'success'
        except Exception as e:
            print(e)
            return None
    
    
    def df_dataset_query_all(table_name, db_name='db', ids=False):
        try:
            db = dataset.connect('sqlite:///' + db_name + '.sqlite')
            table = db[table_name]
            from_sql = table.all()
            data = []
            for row in from_sql:
                data.append(row)
            df = pd.DataFrame(data, columns=from_sql.keys)
            if not ids:
                df.drop('id', axis=1, inplace=True)
            return df
        except Exception as e:
            print(e)
            return None
    
    
    # create dataframe
    users = pd.DataFrame()
    names = ['Bob', 'Jane', 'Alice', 'Ricky']
    ages = [31, 30, 31, 30]
    users['names'] = names
    users['ages'] = ages
    
    # save dataframe
    df_dataset_save(users, 'users')
    
    # query saved dataframe
    new_user = df_dataset_query_all('users')
    
    print(new_user)
    
    '''
        names  ages
    0     Bob    31
    1    Jane    30
    2   Alice    31
    3   Ricky    30
    '''
    

    【讨论】:

      【解决方案3】:

      Dataset module 投入大量时间后,我发现 all() 可以迭代成一个列表,然后变成一个 pandas 数据框。有没有更好的方法来做到这一点?

      import dataset
      import pandas as pd
      
      # create dataframe
      df = pd.DataFrame()
      names = ['Bob', 'Jane', 'Alice', 'Ricky']
      ages = [31, 30, 31, 30]
      df['names'] = names
      df['ages'] = ages
      
      print(df)
      
      # create a dict oriented as records from dataframe
      user = df.to_dict(orient='records')
      
      # using dataset module instantiate database
      db = dataset.connect('sqlite:///mydatabase.db')
      
      # create a reference to a table
      table = db['user']
      
      # insert the complete dict into database
      table.insert_many(user)
      
      # use Dataset .all() to retrieve all table's rows
      from_sql = table.all()  # custom ResultIter type (iterable)
      
      # iterate ResultIter type into a list
      data = []
      for row in from_sql:
          data.append(row)
      
      # create dataframe from list and ordereddict keys
      df_new = pd.DataFrame(data, columns=from_sql.keys)
      
      # this does not drop the id column, but it should??
      df_new.drop(columns=['id'])
      
      print(df_new)
      

      '''
         names  ages
      0    Bob    31
      1   Jane    30
      2  Alice    31
      3  Ricky    30
      
            id  names  ages
      0      1    Bob    31
      1      2   Jane    30
      2      3  Alice    31
      3      4  Ricky    30
      
      '''
      

      【讨论】:

        【解决方案4】:
        import pandas as pd
        df = pd.DataFrame(data=db['user'])
        df
        

        类似

        pd.DataFrame(db['user'])
        

        应该做同样的事情

        您还可以指定列或索引:

        https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html

        【讨论】:

        • 此解决方案是否根据问题使用数据集模块?我没有看到数据集的导入。
        猜你喜欢
        • 2022-07-28
        • 2022-08-20
        • 2013-02-01
        • 2014-05-09
        • 1970-01-01
        • 2018-06-03
        • 2012-02-05
        • 2012-01-07
        • 2020-01-16
        相关资源
        最近更新 更多