假设我具有以下类型的数据框:
/////////////// 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>    ";
}
?>
对于 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
的行都将被删除,因为其中有一个col1
与b
不同。
与a
中的唯一值相对应的行将保留。最后,在col1
中所有重复的值中(假设所有重复值都具有相同的对应col1
值),仅保留一个。因此输出为:
col2
是否有一种不使用 col1 col2
6 456 d
8 678 e
9 897 f
循环的有效方法?
答案 0 :(得分:2)
IIUC groupby
和nunique
,然后我们进行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中搜索重复项时,可以使用subset
和keep
参数。
样本:
# 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
值的行