Фрейм данных Pandas сравнивает несколько строк с определенным условием

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Надеюсь, я смогу правильно объяснить свою проблему.. У меня есть фрейм данных (306×40) с несколькими строками, содержащими данные определенной группы, мне нужно сгруппировать их по индексу, это не проблема. Затем мне нужно сравнить строки с другой строкой, которая имеет определенное условие. Возьмите эти данные в качестве примера:

 Id  Condition   var1   var2   var3
1      1         0      1      0
1      3         1      1      0
2      2         0      0      1
2      3         0      0      1
2      1         0      0      1
 

Поэтому мне нужно сравнить var1, var2, var3 для каждого идентификатора со строкой, имеющей условие 3..
Результат даст мне знать, что любая из переменных отличается от переменных в условии 3.
Возможные результаты:

 Id  Condition   var1   var2   var3  count_false
1      1        false  true   true      1
1      3        NaN    NaN    NaN       NaN
2      2        true   true   true      0
2      3        NaN    NaN    NaN       NaN
2      1        true   true   true      0
 

Или просто сказать, что условие x не совпадает с условием 3 для идентификатора y

Я надеюсь, что вы, ребята, понимаете, что мне нужно, но я рад уточнить

Заранее большое вам спасибо!

отредактируйте, чтобы сделать его более понятным:

Данные состоят из данных из 3 различных методов обнаружения бактерий у пациентов (клинических данных), обратите внимание, что для каждого пациента он отличается тем, какой метод использовался и сколько раз. Итак, у меня есть метод 1, 2, 3, это разные условия. Переменные — это различные виды обнаруженных бактерий. Методы 1 и 2 являются золотым стандартом, а метод 3 — тот, который необходимо проверить. Итак, я хочу посмотреть, дает ли метод 3 тот же результат, что и метод 1 или 2. более 30 переменных — это бактерии, а значение 1 указывает на наличие бактерий, а 0 отсутствует.

Комментарии:

1. Я прочитал это примерно три раза и до сих пор не понимаю, что вы хотите сделать. Почему некоторые строки заменяются на NaN ?

2. Спасибо, что нашли время. Я отредактировал свой пост, чтобы сделать его, надеюсь, более понятным. Я не знаю, почему я поместил туда NaN, просто чтобы показать, что переменные с помощью методов 1 и 2 необходимо сравнивать с методом 3.

3. то есть вы имеете в виду, что каждая строка var3 может быть вычислена только из var1 и var2 из этой строки, т. Е. Независимо от других строк? Почему тогда groupby?

4. Не совсем, извините за неясность. Итак, в пределах 1 пациента для поиска бактерий используется несколько методов, в примере df я назвал этот столбец значением условия 1 (метод 1), 2 (метод 2) или 3 метода (3). С помощью этих разных методов мы обнаружили много разных бактерий, в примере df я назвал эти столбцы var1, var2, var3 … и т.д. значение 0 отсутствует, 1 присутствует. Мне нужно проверить, привел ли метод 3 к тем же результатам, что и методы 1 и 2, так что var1, var2, var3 одинаковы для метода 3 и 1 или 2. В примере df: совпадают ли значения для var1,2,3 во второй строке с первой строкой

5. и для пациента 2, отличаются ли var1, var2, var3 в строках 3 и 5 по сравнению со строкой 4 (используется метод 3)

Ответ №1:

Если я правильно понимаю, речь идет только о подсчете того, сколько var1 .. var2 из них отличается от var3 строки за строкой. Группировка не задействована.

Если это так (рад изменить, если нет), то:

 cols = 'var1 var2 var3'.split()  # can be extended to more variables
df['count_diff'] = (df[cols[:-1]].values != df[cols[-1]].values[:, None]).sum(axis=1)
 

На модифицированном примере:

 df = pd.DataFrame({
    'Id': [1, 1, 2, 2, 2],
    'Condition': [1, 3, 2, 3, 1],
    'var1': [0, 1, 0, 1, 0],
    'var2': [1, 1, 0, 1, 0],
    'var3': [0, 0, 1, 1, 1]})

cols = 'var1 var2 var3'.split()
df['count_diff'] = (df[cols[:-1]].values != df[cols[-1]].values[:, None]).sum(axis=1)
print(df)

# output:
   Id  Condition  var1  var2  var3  count_diff
0   1          1     0     1     0           1
1   1          3     1     1     0           2
2   2          2     0     0     1           2
3   2          3     1     1     1           0
4   2          1     0     0     1           2
 

Ответ №2:

#x!=x.loc[i] дает вам значение истинности каждой строки при сравнении с вашей желаемой (условной) строкой. Остальная часть кода приведена ниже:

 df=pd.DataFrame([[1,1,0,1,0],[1,3,1,1,0],[2,2, 0,0,1],[2,3, 0,0,1],[2,1, 0,0,1]],columns=['ID','Condition','var1','var2','var3'])
def comp(x):
    i=x.index[x['Condition']==3][0]
    #print(x!=x.loc[i])
    truth=(x[['var1','var2','var3']]==x.loc[i,['var1','var2','var3']])
    x=pd.concat([x[['ID','Condition']],truth],axis=1)
    return x
grp=df.groupby('ID').apply(comp)
grp['count_false']=grp[['var1','var2','var3']].apply(lambda x: 3-x.sum(),axis=1)
print(grp)
 

Комментарии:

1. Это именно то, что мне нужно, большое вам спасибо! Единственная проблема — это ложное количество, оно дает огромные числа, я пытаюсь исправить это сейчас.