删除熊猫中所有具有同一列值而另一列具有不同值的行

时间:2019-05-14 16:01:14

标签: python pandas

假设我具有以下类型的数据框:

/////////////// THE VIEW //////////


<?php

//define('__ROOT__', dirname(dirname(__FILE__))); 
//require_once(__ROOT__.'/barcode128.php');
//require_once('../barcode/barcode128.php');
//require_once dirname( __FILE__ ) . '/barcode128.php';
//require_once($_SERVER['DOCUMENT_ROOT'].'/barcode/barcode128.php');
//echo include(base_url().'../barcode/barcode128.php');
//require_once 'barcode128.php';
//require 'barcode128.php';
//include 'barcode128.php';
$product    = $_POST['product'];
$product_id = $_POST['product_id'];
$rate       = $_POST['rate'];

for ($i = 1; $i <= $_POST['print_qty']; $i++) {
    echo "<p class='inline'><span ><b>$product</b></span>" . Barra128(stripcslashes($_POST['product_id'])) . "<span ><b>Precio: " . $rate . " </b><span></p>&nbsp&nbsp&nbsp&nbsp";
}

?>

对于 col1 col2 0 123 a 1 123 a 2 123 a 3 123 b 4 345 a 5 345 c 6 456 d 7 456 d 8 678 e 9 897 f 中的特定重复值,所有对应的col1值应完全相同。如果甚至相应的col2值之一都不相同,则将删除该col2值的所有实例。因此,在上面的示例中,col1中所有具有123的行都将被删除,因为其中有一个col1b不同。

a中的唯一值相对应的行将保留。最后,在col1中所有重复的值中(假设所有重复值都具有相同的对应col1值),仅保留一个。因此输出为:

col2

是否有一种不使用 col1 col2 6 456 d 8 678 e 9 897 f 循环的有效方法?

2 个答案:

答案 0 :(得分:2)

IIUC groupbynunique,然后我们进行isin + drop_duplicates

s=df.groupby('col1').col2.nunique().ne(1)
yourdf=df.loc[~df.col1.isin(s.index[s]),:].drop_duplicates()
yourdf
Out[974]: 
   col1 col2
6   456    d
8   678    e
9   897    f

答案 1 :(得分:2)

在DataFrame中搜索重复项时,可以使用subsetkeep参数。

样本:

# make df
data = zip([123, 123, 123, 123, 345, 345, 456, 456, 678, 897], 
           ['a', 'a', 'a', 'b', 'a', 'c', 'd', 'd', 'e', 'f'])
df = pd.DataFrame(data=data, columns=['col1', 'col2'])

# dedupe
df.drop_duplicates().drop_duplicates(subset=['col1'], keep=False)

# output
#   col1 col2
# 6  456    d
# 8  678    e
# 9  897    f

第一个.drop_duplicates()保留每个唯一行的第一个实例。第二个参数删除col1具有相同值的所有行,而与col2无关(不保留任何行)。由于此时我们只处理唯一的行,因此.drop_duplicates(subset=['col1'], keep=False)必然只丢弃具有重复的col1值和不同的col2值的行