按 Pandas 中一行中的值过滤列

Filter columns by values in a row in Pandas

我在 Pandas.

中通过 df.describe() 获得了我的数据帧的统计信息
statistics = df.describe()

我想根据计数过滤统计数据帧:

    main    Meas1     Meas2 Meas3   Meas4  Meas5
    sublvl  Value     Value Value   Value   Value       
    count   7.000000  1.0   1.0     582.00  97.000000       
    mean    30        37.0  26.0    33.03   16.635350

我想要这样的东西: 过滤掉计数小于 30 的所有值,并仅显示新数据框中计数 >30 的列(或者给我一个列表,其中包含计数 >30 的所有主要值)。

对于上面的例子,我要:

    main       Meas4    Meas5
    sublvl     Value    Value       
    count      582.00   97.000000       
    mean       33.03    16.635350

[Meas4, Meas5]

我试过了

thresh = statistics.columns[statistics['count']>30]

及其变体。

import pandas as pd

df = pd.DataFrame.from_dict({'name':[1,2,3,4,5], 'val':[1, None,None,None,None]})

df

name    val
0   1   1.0
1   2   NaN
2   3   NaN
3   4   NaN
4   5   NaN

如果您想使用 describe(),请注意 describe 不会给出所有列。默认情况下只返回数值数据类型的列:

你可以这样做:

statistics = df.describe()

# to describe all columns you can do this
statistics = df.describe(include = 'all')

[column for column in statistics.columns if statistics.loc['count'][column] > 3]
# output ['name']

正如评论中所讨论的,因为这是一个多索引列,只选择第一个索引,我们可以这样做:

# [column[0] for column in statistics.columns if statistics.loc['count'][column] > 3] # this code won't work correctly for non multi index dataframes.

对于每一列,检查计数是否 > 阈值并将其添加到 chosen_columns 列表:

chosen_columns = []
for column in df.columns:
    if len(df[column].value_counts()) > 3:
        chosen_columns.append(column)

# chosen_columns output: ['name']

或:

chosen_columns = []
for column in df.columns:
    if df[column].count() > 3:
        chosen_columns.append(column)

# chosen_columns output: ['name']

在 pandas 中按列选择值要容易得多,因此您可以先进行转置,select 随心所欲,然后转回。

statistics.T[statistics.T['count']>30].T