Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据条目从pandas.Dataframe中删除行_Python_Pandas_Dataframe - Fatal编程技术网

Python 根据条目从pandas.Dataframe中删除行

Python 根据条目从pandas.Dataframe中删除行,python,pandas,dataframe,Python,Pandas,Dataframe,给定一个pandas.DataFrame: | Col_A | Col_B | Other_Columns 0 | A0 | B0 | … 1 | A1 | B1 | … 2 | A2 | B2 | … 3 | A3 | B3 | … … | … | … | … 我一直试图保留此数据框的一个子集:删除a和B条目都是唯一的行(例如,如果在第6行,那么A6和B6这两个值都不会出现在数据框的任何其他位置,我们

给定一个
pandas.DataFrame

    | Col_A | Col_B | Other_Columns
0   | A0    | B0    | …
1   | A1    | B1    | …
2   | A2    | B2    | …
3   | A3    | B3    | …
…   | …     | …     | …
我一直试图保留此
数据框的一个子集
:删除
a
B
条目都是唯一的行(例如,如果在第6行,那么
A6
B6
这两个值都不会出现在
数据框
的任何其他位置,我们希望删除这一行)

我不想丢弃重复的。此外,我不希望得到唯一的值(如果我理解得很好,这类似于将列表转换为集合,对吗?),而是只显示一次的值

在这一点上,我得到的是:

counts = df[['Col_A','Col_B']].stack().value_counts(ascending=True)
myList = [0] + [item for item in counts[counts.values == 1].index]
toRemove = []
for i in df.index:
    if (df.at[i,'Col_A'] and df.at[i, 'Col_B']) in myList:
        toRemove.append(i)
final_df = df[~df.index.isin(toRemove)]
这不是很有效(数据帧非常大>10米线)必须有一个更具python风格的策略,包括熊猫的内置功能,对吗? 另外,我不太确定第一行是否正确:通过堆叠两列,我是否确保对两列的条目进行计数

如果您需要更多信息,或者您不清楚我的文字,请不要犹豫


非常感谢您抽出时间:-)

像这样的东西怎么样:

In [75]: df = pd.DataFrame(np.random.randint(0,100,size=(10, 3)), columns=list('abc'))

In [76]: df
Out[76]:
    a   b   c
0  37  85  17
1  19   0  11
2  51  20  65
3  59  92  65
4  48  15  91
5  21  50  44
6  61  94  49
7  51   6  88
8  89  72  40
9   5  51  79

In [77]: c = df[['a','b']].stack().value_counts()

In [78]: c
Out[78]:
51    3
94    1
15    1
37    1
6     1
72    1
50    1
21    1
5     1
48    1
61    1
19    1
20    1
85    1
89    1
59    1
92    1
0     1
dtype: int64

In [79]: c[c>1]
Out[79]:
51    3
dtype: int64

In [80]: vals = c[c>1].index

In [81]: df[(df['a'].isin(vals)) | (df['b'].isin(vals))]
Out[81]:
    a   b   c
2  51  20  65
7  51   6  88
9   5  51  79
更新:

当您在myList中执行
if(df.at[i,'Col_A']和df.at[i,'Col_B'])时:
检查您的检查不太正确

以下是正在发生的事情:

In [90]: df.at[0, 'a'], df.at[0, 'b']
Out[90]: (37, 85)

In [91]: (df.at[0, 'a'] and df.at[0, 'b'])
Out[91]: 85

所以你不能用这种方式检查它

@unutbu,在我看来,它不是重复的。OP希望保留两列中的值都不存在的行unique@MaxU:我的错误;谢谢重新打开。非常感谢MaxU,你的建议答案很清楚,你的代码也很快。我一直在玩它,但有一个疑问仍然存在:如果我尝试使用在数据帧索引上循环的缓慢方法,我会得到完全不同的输出:
keepIndex=[]
对于df.index中的I.index:if df.at[I,'a']或vals中的df.at[I,'b']:keepIndex.append(I)
final\u df=df[df.index.isin(keepIndex)]我的代码是在做一件完全不同的事情吗?我是不是遗漏了什么?@universaltraveler,请阅读我回答中的“更新:”部分好的,非常感谢澄清:-)你知道为什么吗?@universaltraveler,很乐意帮助。当您运行
1或3
时,python将检查是否至少有一个数字为真(即!=0),因此它将返回
1
。如果执行
1和3
,python将检查这两个数字是否为真(!=0),因此它将返回最后一个-
3
。当您执行
if(df.at[i,'a']或df.at[i,'b'])
时,就会发生这种情况-基本上它将被转换为
if()
。我建议你玩它:
print(3或5);打印(3和5)