【发布时间】:2022-01-20 20:46:03
【问题描述】:
假设我有一个包含三列数据类型(object、int 和 float)的数据框:
df = pd.DataFrame({
'col1': [1, 2, np.nan, 5],
'col2': [3, 4, 5, 4],
'col3': ['This is a text column'] * 4
})
我需要将np.nan 替换为None,这是一个对象(因为None 在导入PostgresSQL 时变为NULL)。
df.replace({np.nan: None}, inplace=True)
我认为(如果我错了,请纠正我)None 不能在任何 NumPy/Pandas 数组中使用,除了 dtype 为 object 的数组。所以上面的'col1'在replace之后变成了object列。现在,如果我只想对字符串列进行子集化(在这种情况下应该只是'col3'),我不能再使用df.select_dtypes(include=object),它会返回所有object dtype 列,包括'col1'。我一直在使用这个 hacky 解决方案来解决这个问题:
# Select only object columns, which includes 'col1'
(df.select_dtypes(include=object)
# Hack, after this, 'col1' becomes float again since None becomes np.nan
.apply(lambda col: col.apply(lambda val: val))
# Now select only the object columns
.select_dtypes(include=object))
我想知道是否有惯用(或不那么老套)的方法来实现这一点。这个用例确实出现了,因为我需要从数据框中获取字符串列,其中有数字(float 或 int)列,其中缺少由None 表示的值而不是np.nan。
另一种解决方案
基于以下 Mayank Porwal 的解决方案:
# The list comprehension returns a boolean list
df.loc[:, [pd.to_numeric(df[col], errors='coerce').isna().all() for col in df.columns.tolist()]]
【问题讨论】: