2017-08-15 84 views
1

我有一个列索引to_delete,我想从两个Pandas Dataframes,df1 & df2中删除。他们都有500行。 to_delete有50个条目。 我运行此:试图从Pandas Dataframe中删除多行但删除比预期更多的行

df1.drop(df1.index[to_delete], inplace=True) 
df2.drop(df2.index[to_delete], inplace=True) 

但是这导致在以各行250 DF1和DF2。它从每个删除250行,而不是我想要的50个特定行...

to_delete按降序排列。

完整的方法:

def method(results): 
    #results is a 500 x 1 matrix of 1's and -1s 
    global df1, df2 
    deletions = [] 
    for i in xrange(len(results)-1, -1, -1): 
     if results[i] == -1: 
     deletions.append(i) 
    df1.drop(df1.index[deletions], inplace=True) 
    df2.drop(df2.index[deletions], inplace=True) 

任何建议,我在做什么错?

(我也用.iloc代替.index和删除在if statement,而不是追加到列表中第一次尝试。

+0

如果DF的索引不是唯一的(例如'数据= pd.DataFrame(np.arange(12).reshape(4,3),列= [ 'A', 'B', 'C' ],index = [1,1,2,3])'),然后'data.drop(data.index [[1,2]],inplace = True)'会删除三行,即使你已经通过只有两个指标下降。 –

回答

1

你的索引值不是唯一的,当您使用drop它是消除那些所有行索引值。to_delete可能已经长度50但有250行的是那些具有特定索引值。

考虑例如

df = pd.DataFrame(dict(A=range(10)), [0, 1, 2, 3, 4] * 2) 

df 

    A 
0 0 
1 1 
2 2 
3 3 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

假设您想要删除第一行,第三行和第四行。

to_del = [0, 2, 3] 

用你的方法

df.drop(df.index[to_del]) 

    A 
1 1 
4 4 
1 6 
4 9 

这是一个问题


选项1
使用np.in1d找到to_del
补充这是更自我解释比日其他人。我正在查看从0n的数组,看看它是否在to_del。结果将是一个与df长度相同的布尔数组。我使用~来取反,并使用它来分割数据帧。

df[~np.in1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

选项2
使用np.bincount找到to_del
补充这通过计算to_del边界的位置来完成同样的事情,选择1。我最终得到了一个01的数组,其中在to_del0其他地方定义的每个位置都有一个1。我想保留0 s,所以我通过查找它等于0的位置来创建布尔数组。然后我用它来分割数据帧。

df[np.bincount(to_del, minlength=len(df)) == 0] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

选项3
使用np.setdiff1d找到位置
它使用设置逻辑找到位置的全阵列,只是我想删除的那些之间的区别。然后我使用iloc进行选择。

df.iloc[np.setdiff1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 
+0

谢谢,你的建议奏效!与选项2,但我不明白它实际上在做什么。你能解释一下吗?另外,出于好奇,我使用pd.read_csv来获取我的数据框,那么索引如何不唯一?我从来没有设置过任何东西,我只是假设索引基本上只是行号? (对不起,我是Python新手(约3周))。 – MahDhan

+0

我已经添加了一些评论。希望有所帮助。 – piRSquared

+0

@MahDhan关于索引唯一性。这是我能想象你的情况如何发生的唯一方式。读取csv时,可以将该文件的一部分用作索引。它可能不是唯一的。此外,当你提问时。当你提供一个造成你问题的例子时,我们更喜欢它。这样,我们消除了含糊不清的情况,并让所有参与者都能更轻松地获得所需。 – piRSquared