【问题标题】:Selecting a subset using dropna() to select multiple columns使用 dropna() 选择子集以选择多个列
【发布时间】:2018-09-06 03:46:29
【问题描述】:

我有以下数据框:

df = pd.DataFrame([[1,2,3,3],[10,20,2,],[10,2,5,],[1,3],[2]],columns = ['a','b','c','d'])

从这个 DataFrame 中,我想删除子集 ['b', 'c', 'd'] 中所有值都为 NA 的行,这意味着应该删除最后一行。

以下代码有效:

df.dropna(subset=['b', 'c', 'd'], how = 'all')

但是,考虑到我将使用更大的数据帧,我想使用范围 ['b':'d'] 选择相同的子集。如何选择这个子集?

【问题讨论】:

  • @ayhan 是的,类似的,除了我意识到: 可能会导致昂贵的副本:-)
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,我正在调查columns.slice_locs 以避免这种情况,但你的是一个不错的黑客。 :)

标签: python pandas


【解决方案1】:

IIUC,使用loc,检索这些列,并将其传递给dropna

c = df.loc[0, 'b':'d'].columns  # retrieve only the 0th row for efficiency
df = df.dropna(subset=c, how='all')

print(df) 
    a     b    c    d
0   1   2.0  3.0  3.0
1  10  20.0  2.0  NaN
2  10   2.0  5.0  NaN
3   1   3.0  NaN  NaN

【讨论】:

  • 这是一个有趣的 hack ;-)
  • 缺少一个冒号,否则你会得到一个没有列的系列:c = df.loc[:0, 'b':'d'].columns
【解决方案2】:

类似于@ayhan's idea - 使用df.columns.slice_indexer

In [25]: cols = df.columns[df.columns.slice_indexer('b','d')]

In [26]: cols
Out[26]: Index(['b', 'c', 'd'], dtype='object')

In [27]: df.dropna(subset=cols, how='all')
Out[27]:
    a     b    c    d
0   1   2.0  3.0  3.0
1  10  20.0  2.0  NaN
2  10   2.0  5.0  NaN
3   1   3.0  NaN  NaN

【讨论】:

  • 啊,我今天没有票了,对所有可怕的问题都投了反对票。 >:-(我会为此撤消一些!
  • @cᴏʟᴅsᴘᴇᴇᴅ,不要让权力的黑暗面控制你:-D
【解决方案3】:

您也可以对列列表进行数字切片:

c = df.columns[1:4]  
df = df.dropna(subset=c, how='all')

如果使用数字不切实际(即数不胜数),则有一些麻烦的解决方法:

start, stop = df.columns.get_loc('b'), df.columns.get_loc('d')
c = df.columns[start:stop+1]
df = df.dropna(subset=c, how='all')

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2021-11-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多