Панды: перебирать повторяющиеся строки, чтобы проверить уникальные значения - PullRequest
0 голосов
/ 25 сентября 2019

Учитывая данные кадра следующим образом:

 col1 col2
a  0  True 
b  0  True
c  1  True
d  1  False
e  2  False
f  2  False
g  3  True

Для каждого уникального значения в col1, я хотел бы проверить, все ли значения в col2 совпадают, в противном случае отбросьте все строки для этого соответствующего значения, так что это будетвыход:

 col1 col2
a  0  True 
b  0  True
e  2  False
f  2  False
g  3  True

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Вы хотите nunique:

df[df.groupby('col1')['col2'].transform('nunique').eq(1)]

Вывод:

   col1   col2
a     0   True
b     0   True
e     2  False
f     2  False
g     3   True
0 голосов
/ 25 сентября 2019

Что вы пробовали?Похоже, довольно простая проблема.Я бы использовал shape и drop_duplicates ():

data=[
 col1 col2
a  0  True 
b  0  True
c  1  True
d  1  False
e  2  False
f  2  False
g  3  True
]

cols=["col1","col2"]
df=pd.DataFrame(data, columns=cols)

for ind, row in df.drop_duplicates(subset=["col1"])["col1"].iteritems():
    df1=df[df["col1"]==row]
    if df1.shape[0] == df1.drop_duplicates().shape[0]:
        #logic goes here

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

0 голосов
/ 25 сентября 2019

Одно из возможных решений: сгруппировать по col1 и отфильтровать каждую группу, проверяя, все ли значения col2 равны True или все они равны False :

df.groupby('col1').filter(lambda x: x.col2.all() | (~x.col2).all())
...