Pandas - 根据子集中的数据类型选择列

Posted

技术标签:

【中文标题】Pandas - 根据子集中的数据类型选择列【英文标题】:Pandas - select columns based on datatypes in subset 【发布时间】:2021-01-25 17:18:47 【问题描述】:

在 Pandas 的数据框中,一些列是数字的,例如浮点数;有些是非数字的,比如对象。我们想要删除那些数字列是 NaN 的行,而不是那些非数字列是 NaN 的行。

例如,对于有四列的df:A、B、C和D。A和C的数据类型是Object,B和D的数据类型是Float。

**A(Object)   B(Float)C(Object)   D(Float)**

Apple       NaN     String1     1.0
Orange      2.0     NaN         3.0
Banana      4.0     String2     5.0
NaN         1.0     String3     2.0
Pear        NaN     String4     3.0
Melon       2.0     String5     NaN

我们只会删除一些数字列(浮点数)为 NaN 的行,而不应删除一些非数字列(对象)为 NaN 的行。

最终结果如下:

**A(Object)   B(Float)C(Object)   D(Float)**

Orange      2.0     NaN         3.0
Banana      4.0     String2     5.0
NaN         1.0     String3     2.0

我的步骤是:

    检查哪些列的数据类型是数字,例如 Float:我们得到“B”和“D”列,因为它们的数据类型是 Float; 使用子集通过方法 dropna 删除数字列中包含 NaN 的行。

以下是代码:

df = penguins.dropna(0, how='any', subset=['B','D'])

但是如果数值列的数量非常多,这段代码会非常长,有时几乎不可能。

那么如何根据subset=[] 中的数据类型来选择这些列呢?

我正在考虑 lambda 和管道,但我不太确定。

非常感谢!

【问题讨论】:

【参考方案1】:

你可以像这样使用select_dtypes

df[df.select_dtypes(include='number').notna().all(axis=1)]

输出:

        A    B        C    D
1  Orange  2.0      NaN  3.0
2  Banana  4.0  String2  5.0
3     NaN  1.0  String3  2.0

【讨论】:

【参考方案2】:

试试这个:

df = df[df['B'].notna()]
df = df[df['D'].notna()]

【讨论】:

以上是关于Pandas - 根据子集中的数据类型选择列的主要内容,如果未能解决你的问题,请参考以下文章

pandas dataframe:如何根据列的值聚合行的子集

pandas根据数据类型筛选数据

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

Python Pandas 子集列 x 值基于列 y 中的唯一值

如何根据 pandas 数据框中的数据类型填充 NaN 值?

根据列中的条件对数据框中的行进行子集/过滤