正在删除数据帧中小于0的列

2024-05-19 00:04:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,它有大量的列,我想删除值低于0且为负值的列。但我希望这样做不会影响第一列中的两个列,即id和Class值

d = {'val1': [0.1, 0.2, 0.3, 0.45, 0.56, 0.6, 0.99, 0.12, 0.41, 10], 'val2':[-1, -0.1, -0.2, 1, 0.5, -2, 0.6, 1, -10, 0.001], 'val3': [10, 500, 200, 123, 53, 99, 12312, 9, 51, 421], 'val4':[4, 5, 99, 100, 41, 2, 5, 123, 53, 123]}
    
df = pd.DataFrame(data=d)

对于本例,预期的输出只是那些值不等于、小于零或为负值的列,而不是列类和列Id:

  d = {'val3': [10, 500, 200, 123, 53, 99, 12312, 9, 51, 421], 'val4':[4, 5, 99, 100, 41, 2, 5, 123, 53, 123]}
        
    df = pd.DataFrame(data=d)

Tags: iddataframedfdataclasspdval1本例
2条回答

使用^{}

new_df = df.drop(columns=df.le(0).any()[2:].loc[lambda x: x].index)
print(new_df)

输出

   Class  Id   val1   val3  val4
0      0   0   0.10     10     4
1      1   1   0.20    500     5
2      0   2   0.30    200    99
3      1   3   0.45    123   100
4      0   4   0.56     53    41
5      1   5   0.60     99     2
6      0   6   0.99  12312     5
7      1   7   0.12      9   123
8      1   8   0.41     51    53
9      0   9  10.00    421   123

或:

df.drop(columns=df[df.columns.difference(['Class', 'Id'])].le(0)
        .any()
        .loc[lambda x: x].index)

只要做:

res = df.loc[:, (~df.le(0).any(0) | df.columns.isin(('Class', 'ID'))) ]
print(res)

输出

   Class   val1   val3  val4
0      0   0.10     10     4
1      1   0.20    500     5
2      0   0.30    200    99
3      1   0.45    123   100
4      0   0.56     53    41
5      1   0.60     99     2
6      0   0.99  12312     5
7      1   0.12      9   123
8      1   0.41     51    53
9      0  10.00    421   123

表达方式:

~df.le(0).any(0)

将排除至少有1个值小于或等于0的所有列,第二部分:

df.columns.isin(('Class', 'ID'))

确保包含列ClassID|运算符是逻辑or

相关问题 更多 >

    热门问题