Панды, отбрасывать дублирующиеся строки на основе значений других столбцов - PullRequest
2 голосов
/ 08 октября 2019

Пример данных:

df1 = pd.DataFrame({
    'file': ['file1','file1','file1','file2','file2','file2','file3','file3','file3'],
    'prop1': ['True','False','True','False','False','False','True','False','False'],
    'prop2': ['False','False','False','False','True','False','False','True','False'],
    'prop3': ['False','True','False','True','False','True','False','False','True']
})

file    prop1   prop2   prop3
0   file1   True    False   False
1   file1   False   False   True
2   file1   True    False   False
3   file2   False   False   True
4   file2   False   True    False
5   file2   False   False   True
6   file3   True    False   False
7   file3   False   True    False
8   file3   False   False   True

File1 имеет prop1 true 2 раза, file2 имеет prop3 2 раза, file3 имеет каждый props 1 раз. Поэтому мне нужно сделать еще один кадр данных, как это:

    file    prop
0   file1   prop1
1   file2   prop3
2   file3   diff (file3 props are different)

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Поскольку ваши данные string вместо bool, нам нужен небольшой трюк:

(df1.iloc[:,1:].eq('True')  # props are string
    .groupby(df1['file'])   # groupby each file
    .sum()                  # count the True's in each group
    .gt(1)                  # mask the column with more than 1 True
    .dot(df1.columns[1:])   # get the column name
    .replace('','diff')     # fill those files with no double True
)

вывод:

file
file1    prop1
file2    prop3
file3     diff
dtype: object
2 голосов
/ 08 октября 2019

Мы можем использовать idxmax объединить sum, чтобы обнаружить значение max

s=df1.set_index('file').sum(level=0)

s.idxmax(1).mask(s.eq(s.max(1),axis=0).sum(1)==3,'diff')
file
file1    prop1
file2    prop3
file3     diff
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...