Поиск дубликатов в одном столбце с не дублированием в другом - PullRequest
0 голосов
/ 17 ноября 2018

Я борюсь с тем, как взять набор данных и вывести результат, который находит дублирующую информацию в одном столбце, а неповторяющиеся элементы - в другом.Если, скажем, столбцы 0 и 2 являются точными дубликатами, мне наплевать на набор данных, только если есть строки, где столбец 0 содержит записи с более чем одним значением в столбце 2. И, если это так, я хочу, чтобы всестрок, соответствующих столбцу 0.

Сначала я использую concat, чтобы сузить набор данных до строк, имеющих дубликаты.Теперь моя проблема заключается в попытке получить только те строки, в которых столбец 2 отличается.

Мой пример набора данных:

Pattern or URI,Route Filter Clause,Partition,Pattern Usage,Owning Object,Owning Object Partition,Cluster ID,Catalog Name,Route String,Device Name,Device Description
"11111",,Prod_P,Device,"11111",Prod_P,,,,SEPFFFF0723AFE8,device1
"11111",,Prod_P,Device,"11111",Prod_P,,,,SEPFFFF862FAF74,device2
"11111",,Prod_P,Device,"11111",Prod_P,,,,SEPFFFFF2A8AA38,device3
"11111",,Prod_P,Device,"11111",Prod_P,,,,SEPFFFFD2C0A2C6,device4
"22334",,Prod_P,Device,"22334",Prod_P,,,,SEPFFFFCF87AB31,device5
"33333",,Prod_P,Device,"33333",Prod_P,,,,SEPFFFFCF87AAEA,device6
"33333",,Dummy_P,Device,"33333",Dummy_P,,,,SEPFFFF18FF65A0,device7
"33333",,Prod_P,Device,"33333",Prod_P,,,,SEPFFFFCFCCAABB,device8

В этом наборе я хочу получить результат из трех последнихстроки, имеющие «33333», так как они имеют более одного типа значения в столбце 2. «11111» соответствует только Prod_P, поэтому мне все равно.

import pandas as pd
ignorelist = []
inputfile = "pandas-problem-data.txt"
data = pd.read_csv(inputfile)
data.columns = data.columns.str.replace(' ','_')
data = pd.concat(g for _, g in data.groupby("Pattern_or_URI") if len(g) > 1)
data = data.loc[(data["Pattern_Usage"]=="Device"), ["Pattern_or_URI","Partition","Pattern_Usage","Device_Name","Device_Description"]]
new_rows = []
tempdup = pd.DataFrame()
for i, row in data.iterrows():
    if row["Pattern_or_URI"] in ignorelist:
        continue
    ignorelist.append(row["Pattern_or_URI"])
    # testdup = pd.concat(h for _, h in (data.loc[(data["Pattern_or_URI"]==row["Pattern_or_URI"], ["Pattern_or_URI","Partition","Pattern_Usage","Device_Name","Device_Description"])]).groupby("Partition") if len(h) > 1)
    # print(data.loc[(data["Pattern_or_URI"]==row["Pattern_or_URI"], ["Pattern_or_URI","Partition","Pattern_Usage","Device_Name","Device_Description"])])
    newrow = data.loc[(data["Pattern_or_URI"]==row["Pattern_or_URI"], ["Pattern_or_URI","Partition","Pattern_Usage","Device_Name","Device_Description"])]

Если я раскомментирую строку, где япопробуйте использовать тот же конкат, чтобы найти записи с "Раздел"> 1 я получаю ошибку ValueError: No objects to concatenate.Я знаю, что это происходит через первую строку с комментарием print без комментариев.

Есть ли более простой или лучший способ сделать это?Я новичок в пандах и продолжаю думать, что, возможно, есть способ найти то, чего я еще не понял.Спасибо.

Желаемый вывод:

Pattern or URI,Route Filter Clause,Partition,Pattern Usage,Owning Object,Owning Object Partition,Cluster ID,Catalog Name,Route String,Device Name,Device Description
"33333",,Prod_P,Device,"33333",Prod_P,,,,SEPFFFFCF87AAEA,device6
"33333",,Dummy_P,Device,"33333",Dummy_P,,,,SEPFFFF18FF65A0,device7
"33333",,Prod_P,Device,"33333",Prod_P,,,,SEPFFFFCFCCAABB,device8

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Я думаю, что немного ошибочно говорить, что вы ищете дубликаты. Это действительно проблема группировки.

Вы хотите найти группы идентичных значений в Pattern or URI, которые соответствуют более чем одному уникальному значению в вашей серии Partition.


transform + nunique

s = df.groupby('Pattern or URI')['Partition'].transform('nunique').gt(1)
df.loc[s]

   Pattern or URI  Route Filter Clause Partition Pattern Usage  Owning Object Owning Object Partition  Cluster ID  Catalog Name  Route String      Device Name Device Description
5           33333                  NaN    Prod_P        Device          33333                  Prod_P         NaN           NaN           NaN  SEPFFFFCF87AAEA            device6
6           33333                  NaN   Dummy_P        Device          33333                 Dummy_P         NaN           NaN           NaN  SEPFFFF18FF65A0            device7
7           33333                  NaN    Prod_P        Device          33333                  Prod_P         NaN           NaN           NaN  SEPFFFFCFCCAABB            device8
0 голосов
/ 17 ноября 2018

Используя df.drop_duplicates() следующим образом:

df=pd.DataFrame({'a':[111,111,111,222,222,333,333,333], 
                 'b':['a','a','a','b','b','a','b','c'],
                 'c':[12,13,14,15,61,71,81,19]})
df

    a   b   c
0   111 a   12
1   111 a   13
2   111 a   14
3   222 b   15
4   222 b   61
5   333 a   71
6   333 b   81
7   333 c   19

df1=df.drop_duplicates(['a','b'],keep=False)

df1

    a   b   c
5   333 a   71
6   333 b   81
7   333 c   19

Обратите внимание, что вместо того, чтобы назначать его новому DF, вы можете добавить inplace=True, чтобы применить его к исходному

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...