在两列中查找具有双重数据的行,并且仅保留第三列中的值最低的行

时间:2017-12-03 20:12:29

标签: python pandas dataframe set

我有一个包含三列的dataFrame。我想找到带有相同信息的行(无论列中的外观顺序如何)。我想删除所有带有冗余信息的行,但保留第三列中值最小的行:

import pandas as pd
pd.DataFrame({"Dependend variable": ["A", "B", "C"], "Independend variable": ["B", "A", "D"], "pvalue": [0.001, 0.005, 0.001]})

Out[1]: 
  Dependend variable Independend variable  pvalue
0                  A                    B   0.001
1                  B                    A   0.005
2                  C                    D   0.001

获取此dataFrame

是一种很好的pythonic方法
Out[]: 
  Dependend variable Independend variable  pvalue
0                  A                    B   0.001
1                  C                    D   0.001

2 个答案:

答案 0 :(得分:3)

我认为您可以按numpy.sort对{2}列进行排序,然后使用sort_values drop_duplicates对最小值进行排序:

sort1 = np.sort(df[['Dependend variable','Independend variable']], axis=1)
df[['a','b']] = pd.DataFrame(sort1, index=df.index)
print (df)
  Dependend variable Independend variable  pvalue  a  b
0                  A                    B   0.001  A  B
1                  B                    A   0.005  A  B
2                  C                    D   0.001  C  D

df = df.sort_values(['a','b','pvalue']).drop_duplicates(['a','b']).drop(['a','b'],1)
print (df)
  Dependend variable Independend variable  pvalue
0                  A                    B   0.001
2                  C                    D   0.001

答案 1 :(得分:3)

我建议使用相关列中的值创建一个布尔掩码,并将其传递给数据帧。

df =pd.DataFrame({"Dependend variable": ["A", "B", "C"], 
                 "Independend variable": ["B", "A", "D"], "pvalue": [0.001, 0.005, 0.001]})

cols = ['Dependend variable','Independend variable']
df.sort_values('pvalue',inplace=True)
mask = pd.Series(tuple(sorted(x)) for x in df[cols].values).duplicated(keep=False)
df = df[mask]

print(df)

返回:

  Dependend variable Independend variable  pvalue
0                  A                    B   0.001
2                  C                    D   0.001

这个小子集的时间比较,对于更大的jezraels可以更快

  

jezrael:100个循环,最佳3:每循环6.5 ms

     

jezrael:100个循环,3个最好:每个循环7.74毫秒(大集)* 1000

     

antonvbr:100个循环,最佳3:3.09毫秒/循环

     

antonvbr:100个循环,最佳3:12.9毫秒/循环(大集)* 1000