在混合数据类型数据框中删除列的子集中的行

时间:2019-03-02 00:14:11

标签: python pandas

你好,我试图在几列中删除不等于10的值,但不包括某些列

这就是我开始的

df=pd.read_csv('df.csv')
df.head()
     Age  Prod1  Prod2  Day 4  Day 5 ...  Region
0    18     1      0      1.0    5.0  0     1
1    89     3      1      1.0    1.0  1     1
2    100    4      7      0.0    1.0  1     0
3    200    0      1      0.0    0.0  1     0
4    300    1      1      0.0    1.0  1     1
5    19     1      1      1.0    1.0  6     1

共有10,000行和34列

我成功清除了前两列,因为它们的数值与其余数值不同。

这就是我所做的

ageindex = df[ (df['Age'] < 18) & (dfl['Age'] > 150) ].index
df.drop(ageindex)

我想从列Prod1到末尾Region删除行。它只有34列,但我似乎无法弄清楚该如何做。

我找到了一种在此处删除NaN值的方法,但没有找到使用基于值的条件删除该方法的方法。

这是我尝试过的

prodindex1 = df[ (df.loc['Prod1':'Region'] > 1) ].index
df.drop(prodindex1)

但这只是返回相同的数据帧。我也尝试过

prodindex = df[ (df.loc['Prod1':'Region'] > 1) & (df.loc['Prod1':'Region'] < 0) ].index
df.drop(prodindex)

预期输出应为

     Age  Prod1  Prod2  Day 4  Day 5 ...  Region
3    200    0      1      0.0    0.0  1     0
4    300    1      1      0.0    1.0  1     1

我认为我有一些问题,因为其中有些是整数,有些是浮点数。任何指导表示赞赏。

编辑:我想删除值不等于或不等于0的地方

3 个答案:

答案 0 :(得分:1)

import pandas as pd 
import numpy as np 

# Sample data
d = np.array([[18, 1, 0, 1.0, 5.0, 0, 1],
                [89, 3, 1, 1.0, 1.0, 1, 1],
                [100, 4, 7, 0.0, 1.0, 1, 0],
                [200, 0, 1, 0.0, 0.0, 1, 0],
                [300, 1, 1, 0.0, 1.0, 1, 1],
                [19, 1, 1, 1.0, 1.0, 6, 1]])

df = pd.DataFrame(data=d, columns = ['Age','Prod1','Prod2', 'Day 4', 'Day 5', 'Day 6', 'Region'])
df = df.drop(df[~df.loc[:, 'Prod1':'Region'].isin([0, 1]).all(axis=1)].index)    
print(df)

应提供预期的输出:

     Age  Prod1  Prod2  Day 4  Day 5  Day 6  Region
3  200.0    0.0    1.0    0.0    0.0    1.0     0.0
4  300.0    1.0    1.0    0.0    1.0    1.0     1.0


评论您的代码: 您的条件是错误的,但这不是您获得相同数据帧的原因。发生这种情况是因为您没有将df.drop(prodindex)传递给变量,即:

# Your code
prodindex = df[ (df.loc['Prod1':'Region'] > 1) & (df.loc['Prod1':'Region'] < 0) ].index
df = df.drop(prodindex)
print(df) 

Empty DataFrame
Columns: [Age, Prod1, Prod2, Day 4, Day 5, Day 6, Region]
Index: []

答案 1 :(得分:0)

这应该有效:

df[df.loc[:, 'Prod1':'Region'].isin([0, 1]).all(axis=1)]

答案 2 :(得分:0)

如果您希望删除包含值1或0的行,请执行以下操作:

df.loc[~df.loc[:, 'Prod1':'Region'].isin([0, 1]).any(axis=1), :]