python - 如何过滤具有动态列数的数据框?
问题描述
我使用 url 调用下载数据。数据框的列不是静态的。例如,对于一个 url 调用,数据框可以包含x
列,而对于另一个 url 调用,它可以包含y
列等。
始终包含在数据框中的列是id
列。潜在列的名称是:(列col1, col2, col3, col4, col5, col6
除外id
)。
我只想选择它们不包含nan
在所有列中的数据框行。有一种情况是数据框只能包含id
列,因此不需要选择任何行。
假设一个 url 调用使用此假设代码提供以下数据帧:
data = {'id': [1000,2000,3000,4000],
'col1': [np.nan,25000,np.nan,np.nan],
'col2': [np.nan,27000,np.nan,30000],
'col3': [28000,np.nan,np.nan,25000]
}
dfexp = pd.DataFrame(data, columns = ['id', 'col1', 'col2', 'col3'])
id col1 col2 col3
0 1000 NaN NaN 28000.0
1 2000 25000.0 27000.0 NaN
2 3000 NaN NaN NaN
3 4000 NaN 30000.0 25000.0
例如,从上面的数据框中,我只想选择0
行1
和3
。
第二个 url 调用可以使用以下假设代码给出潜在的数据帧:
data2 = {'id': [1500,2500,3500,4500],
'col1': [1900,np.nan,np.nan,np.nan],
'col4': [np.nan,np.nan,np.nan,np.nan],
'col5': [np.nan,np.nan,np.nan,np.nan],
'col6': [np.nan,np.nan,np.nan,25000]
}
dfexp2 = pd.DataFrame(data, columns = ['id', 'col1', 'col4', 'col5', 'col6'])
id col1 col4 col5 col6
0 1500 NaN NaN NaN NaN
1 2500 25000.0 NaN NaN NaN
2 3500 NaN NaN NaN NaN
3 4500 NaN NaN NaN NaN
从这第二个数据框中,我只想选择 row 1
。
一般来说,我只想选择至少有 1 个non-nan
元素的行。我是初学者,动态的东西对我来说很棘手。你有什么想法吗?
先感谢您!
解决方案
采用:
df.set_index('id').dropna(how='all').reset_index()
解释
由于你是初学者,让我稍微解释一下。
这将(步骤 1)临时将列设置id
为索引,然后(步骤 2)删除所有包含所有nan
元素的行(原始列除外,id
因为它现在是索引,并且不会检查调用中的nan
值dropna()
。)我们需要包含参数how='all'
(感谢 anon01 的提醒),因为默认情况下how='any'
,只要任何一列包含nan
. 之后,我们可以(步骤 3)通过调用id
从索引移回列来恢复列。reset_index()
推荐阅读
- qt - 视图之间的转换,最佳实践
- javascript - Formik onChange 不适用于使用 react-select 的下拉菜单
- javascript - 如何在 i18next - React Native 中设置默认语言?
- c - 如果 -0.0 之后的下一个可表示值是 +0.0,那么为什么 nextafter(-0.0, INFINITY) 不返回 +0.0?
- freeradius - Freeradius 3.0 上的 NAS 端口
- php - Laravel 5.8 - 从控制台命令执行后台作业
- c# - AD组授权
- git - 来自 github PR (ScalaNative) 的 sbt scala 插件失败,找不到值
- java - 求和问题的并行实现返回意想不到的结果
- python - OSError: [Errno 63] 文件名太长