#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. Это именно то, что мне нужно, большое вам спасибо! Единственная проблема — это ложное количество, оно дает огромные числа, я пытаюсь исправить это сейчас.