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:如何根据特定列上特定值的条件选择数据框中的行[重复]
Python Pandas 子集列 x 值基于列 y 中的唯一值