【问题标题】:How can I replace missing values from an unbalanced data frame with zeros?如何用零替换不平衡数据框中的缺失值?
【发布时间】:2021-04-08 06:18:33
【问题描述】:

我有一个具有二维 A 和 B 的数据框;但是,此数据框是不平衡的,因为数据库不包含 A 和 B 的所有可能组合的值,因此缺少某些值。我想要做的是确保数据框是平衡的,并且那些缺少的元素用零填充。

我正在使用以下代码从我通过 SQLAlchemy 连接到的 sqlite 数据库中获取数据帧的数据

connection = sqlite3.connect("my_database.db")
cursor = connection.cursor()
# set up a query
cursor.execute('SELECT factorA, factorB,  COUNT(*) as unique_driver_counts FROM block_optimizer_runs GROUP BY 1, 2')
results = cursor.fetchall()
results_df = pd.DataFrame(results, columns=['factorA', 'factorB', 'count'])

但数据库不包含所有可能的因素 A、因素 B 和因素 C 组合的数据。当这些值不存在时,数据库不返回值;但在数据框中,我需要用零填充这些“缺失”值。

例如

import pandas as pd
data = [['dog', 'house', 1], ['dog', 'apartment', 2], ['dog', 'trailer', 1], ['dog', 'cabin', 0], ['dog', 'shack', 1],
['cat', 'house', 3], ['cat', 'apartment', 1], ['cat', 'trailer', 0], ['cat', 'shack', 3],
['gecko', 'apartment', 3], ['gecko', 'trailer', 2], ['gecko', 'shack', 0] ]
df = pd.DataFrame(data, columns = ['factorA', 'factorB', 'count'])
df

但我想要的是

import pandas as pd
data = [['dog', 'house', 1], ['dog', 'apartment', 2], ['dog', 'trailer', 1], ['dog', 'cabin', 0], ['dog', 'shack', 1],
['cat', 'house', 3], ['cat', 'apartment', 1], ['cat', 'trailer', 0], ['cat', 'cabin', 0], ['cat', 'shack', 3],
['gecko', 'house', 0], ['gecko', 'apartment', 3], ['gecko', 'trailer', 2], ['gecko', 'cabin', 0], ['gecko', 'shack', 0]]
df = pd.DataFrame(data, columns = ['factorA', 'factorB', 'count'])
df

谁能帮我弄清楚如何对可能包含两个以上因素的任意数据集执行此操作?

【问题讨论】:

    标签: python sql pandas


    【解决方案1】:

    DataFrame.set_indexDataFrame.reindexMultiIndex.from_product 一起使用:

    df = df.set_index(['factorA','factorB'])
    df = df.reindex(pd.MultiIndex.from_product(df.index.levels), fill_value=0).reset_index()
    print (df)
       factorA    factorB  count
    0      cat  apartment      1
    1      cat      cabin      0
    2      cat      house      3
    3      cat      shack      3
    4      cat    trailer      0
    5      dog  apartment      2
    6      dog      cabin      0
    7      dog      house      1
    8      dog      shack      1
    9      dog    trailer      1
    10   gecko  apartment      3
    11   gecko      cabin      0
    12   gecko      house      0
    13   gecko      shack      0
    14   gecko    trailer      2
    

    或者用Series.unstack添加0DataFrame.stack

    df = (df.set_index(['factorA','factorB'])['count']
             .unstack(fill_value=0)
             .stack()
             .reset_index(name='count'))
    

    【讨论】:

      【解决方案2】:

      一种方法是使用df.pivot

      In [1862]: res = df.pivot('factorA', 'factorB').fillna(0).astype(int).stack().reset_index()
      
      In [1863]: res
      Out[1863]: 
         factorA    factorB  count
      0      cat  apartment      1
      1      cat      cabin      0
      2      cat      house      3
      3      cat      shack      3
      4      cat    trailer      0
      5      dog  apartment      2
      6      dog      cabin      0
      7      dog      house      1
      8      dog      shack      1
      9      dog    trailer      1
      10   gecko  apartment      3
      11   gecko      cabin      0
      12   gecko      house      0
      13   gecko      shack      0
      14   gecko    trailer      2
      

      【讨论】:

        猜你喜欢
        • 2019-09-17
        • 2010-11-18
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2018-02-05
        相关资源
        最近更新 更多