【问题标题】:Enforce DataFrame types and allow NaN强制执行 DataFrame 类型并允许 NaN
【发布时间】:2019-03-28 00:30:52
【问题描述】:

我需要为列初始化一个具有某些数据类型的空 pandas DataFrame,然后将一些可能不包含所有列的行附加到 DataFrame,但列的内容必须是 DataFrame 时声明的内容。 有没有办法做到这一点?

record_list = [
                   { 'lastname'    : 'Ford',
          'firstname'  : 'Ana',
          'agreed'     : 0
                   },
                   { 'lastname'    : 'Snow',
          'agreed'     : 'a'
                    }
                    ]
    df = pd.DataFrame({
    'lastname'    : np.array([], dtype=np.object),
        'firstname'   : np.array([], dtype=np.object),                       
            'agreed'      : np.array([], dtype=np.int64)
                    })

for record in record_list:
    df = df.append([record], ignore_index=True)

上面应该失败,因为'agreed'是字符串,而不是int,但如果它是int,那么NaN应该放在第二条记录的数据框中,即使类型是str。 我也分别尝试了 columns 和 dtype ,但没​​有奏效。请帮忙!

【问题讨论】:

  • 您的工作流程到底是什么?您需要什么样的错误处理?数据有多大,您将多久运行一次?我不知道有一种方法可以让 pandas 强制执行数据类型。你能在 pandas 之外运行这个数据输入过程吗?使用 SQL 还是使用 ETL 工具?
  • 还可以查看:tdda.info/…,不过,它会在事后进行测试,而不是在添加数据时进行测试

标签: python-3.x pandas dataframe


【解决方案1】:

目前还不清楚你最终想要什么。但我正在解释我所理解的。将 pandas 视为传统数据库。您不能将 str 和 int 放在同一列。但默认情况下,如果在数据类型为 int 的列中有 NaN,则默认情况下,它将始终将数据显示为十进制 Ex。 0.0 最好先清理数据并插入到新列表中,然后直接读取到Dataframe。

new_data = []
for item in record_list:
    agrd = item.get("agreed", None)
    if isinstance(agrd, int):
        new_data.append(item)
    else:
        item["agreed"] = None
        new_data.append(item)

df = pd.DataFrame(new_data)

结果:

   agreed firstname lastname
0     0.0       Ana     Ford
1     NaN       NaN     Snow

因为存在 NaN,所以 pandas 将始终显示小数而不是 int。因此,您可以将 NaN 替换为 df.<columnname>.fillna(value=-1),然后使用 df["columnname"] = df.columnname.astype(int) 转换列

【讨论】:

    【解决方案2】:

    加载数据后,您可以像下面这样使用pd.to_numeric() 进行验证并按您喜欢的方式对待它们:

    df=df.append(record_list)
    df.agreed=np.where(pd.to_numeric(df.agreed,errors='coerce').isna(),np.nan,df.agreed)
    print(df)
    
      lastname firstname agreed
    0     Ford       Ana      0
    1     Snow       NaN    NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多