首页 > 解决方案 > 如何过滤具有动态列数的数据框?

问题描述

我使用 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

例如,从上面的数据框中,我只想选择013

第二个 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元素的行。我是初学者,动态的东西对我来说很棘手。你有什么想法吗?

先感谢您!

标签: pythonpandasfilterdynamicnan

解决方案


采用:

df.set_index('id').dropna(how='all').reset_index()

解释

由于你是初学者,让我稍微解释一下。

这将(步骤 1)临时将列设置id为索引,然后(步骤 2)删除所有包含所有nan元素的行(原始列除外,id因为它现在是索引,并且不会检查调用中的nandropna()。)我们需要包含参数how='all' (感谢 anon01 的提醒),因为默认情况下how='any',只要任何一列包含nan. 之后,我们可以(步骤 3)通过调用id从索引移回列来恢复列。reset_index()


推荐阅读