Определите изменение в группе с помощью панд

Вопрос:

У меня есть dataframe, который содержит три строки. «ID» — уникальный идентификатор для человека. «Группа1» и «Группа2» являются идентификаторами групп.

например, ID4 находится в группе B и сейчас находится в группе A.

| ID | Group1 | Group2 | |----|--------|--------| | 1 | A | A | | 2 | A | A | | 3 | A | A | | 4 | B | A | | 5 | B | B | | 6 | B | B | | 7 | C | C | | 8 | C | C | | 9 | C | C | | 10 | D | F | | 11 | D | F | | 12 | D | F | | 13 | D | F | | 14 | D | F |

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

Поэтому, основываясь на людях в группе, 75% группы А являются последовательными. 66,6% группы В являются последовательными. 100% группы С и 100% членов группы D являются теми же членами, что и в группе F.

Это приведет к:

| ID | Group1 | Group2 | Cons | |----|--------|--------|--------| | 1 | A | A | 0.75 | | 2 | A | A | 0.75 | | 3 | A | A | 0.75 | | 4 | B | A | 0.75 | | 5 | B | B | 0.66 | | 6 | B | B | 0.66 | | 7 | C | C | 1.00 | | 8 | C | C | 1.00 | | 9 | C | C | 1.00 | | 10 | D | F | 1.00 | | 11 | D | F | 1.00 | | 12 | D | F | 1.00 | | 13 | D | F | 1.00 | | 14 | D | F | 1.00 |

Не могли бы вы дать мне некоторую помощь о том, как достичь того, что я ищу? Я попробовал pct_change но это не сработает.

спасибо за помощь

РЕДАКТИРОВАТЬ

Большое спасибо за Вашу помощь. Я попробовал как с большим количеством моих данных, так и с небольшой проблемой. Чтобы убедиться: участники могут переключаться только с Group1 на Group2

Вот еще несколько данных и то, что я хочу. Как вы можете видеть (как и в приведенных выше таблицах для ID 4), должно быть ясно, что новая группа 2 BD BD GH A состоит из 33% другой группы, а также группы 2 BD BD GH AG. Для ID от 9 до 13 я хочу сказать, что группа 2 AB состоит из 60% тех же людей. Для Group2 DF DC (ID 14) Я хочу сказать, что эта группа состоит из 33% тех же людей.

ID Group1 Group2 Cons 0 A001 BD BD GH A BD BD GH A 0.333333 1 A002 BD BD GH A BD BD GH A 0.333333 2 A003 BD BD GH A BD BD GH A 0.333333 3 A004 BD BD GH A BD BD GH AG 0.333333 4 A005 BD BD GH A BD BD GH AG 0.333333 5 A006 BD BD GH A BD BD GH AG 0.333333 6 A007 BD BD GH A BD BD GH AF 0.333333 7 A008 BD BD GH A BD BD GH AF 0.333333 8 A009 BD BD GH A BD BD GH AF 0.333333 9 A010 AB AB 0.600000 10 A011 AB AB 0.600000 11 A012 AB AB 0.600000 12 A013 DF DC AB 0.600000 13 A014 DF DC AB 0.600000 14 A015 DF DC DF DC 0.333333 15 A016 AB CDE FGHI-JSHD JS AN CDE FGHI-JSHD JS 1.000000 16 A017 HD MV APS MG HD NV ALS BA HDJ 1.000000 17 A018 LA JF NV WJ LA JF NV OHB 1.000000

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

Надеюсь, это поможет прояснить мою проблему. Прошу прощения, если я не понял этого.

Еще раз большое спасибо за вашу помощь.

Лучший ответ:

Вы можете использовать groupby и transform с помощью настраиваемой функции согласованности. Сначала создайте некоторые данные примера (Примечание: G_Source соответствует вашему G2, тогда как G_Target соответствует G1 в вашем примере):

Создание данных примера

import pandas as pd
import numpy as np

values = np.random.randint(0, 5, size=(10, 2))
columns = ["G_Source", "G_Target"]

df = pd.DataFrame(values, columns=columns).sort_values("G_Source")
print(df)

    G_Source    G_Target
0   0           3
3   0           2
4   0           4
5   0           4
7   0           1
8   1           3
9   2           0
6   3           2
1   4           1
2   4           2

Затем определим функцию согласования. В принципе, мы ищем подсчет наиболее распространенной ценности. Поэтому легко использовать value_counts в сочетании с max.

Определить функцию согласованности

def get_consistency(series):
    max_common = series.value_counts().max()
    size = series.shape[0]

    return max_common / size

Групповое и преобразование

Затем мы группируем по исходной группе (G_Source) и вычисляем согласованность по целевой группе (G_Target) с помощью transform.

df["consistency"] = df.groupby("G_Source")["G_Target"].transform(get_consistency)
print(df)

    G_Source  G_Target  consistency
0   0         3         0.4
3   0         2         0.4
4   0         4         0.4
5   0         4         0.4
7   0         1         0.4
8   1         3         1.0
9   2         0         1.0
6   3         2         1.0
1   4         1         0.5
2   4         2         0.5

Ответ №1

Мы можем использовать здесь две группы, так как вы хотите найти согласованность на основе двух столбцов, т.е.

# Find the consistency of group1 over group2
one = df.groupby('Group1')['Group2'].apply(lambda x : sum(x == x.name)/len(x))

# Find the consistency of group2 over group1
two = df.groupby('Group2')['Group1'].apply(lambda x : sum(x == x.name)/len(x))

# Concat and find the min
prob = pd.concat([one,two.reindex(one.index)],1).min(1)

# Map the values to the dataframe by replacing 0 with 1.
df['Cons'] = df['Group1'].map(prob.where(prob!=0,1))
ID Group1 Group2     Cons
0    1      A      A  0.750000
1    2      A      A  0.750000
2    3      A      A  0.750000
3    4      B      A  0.666667
4    5      B      B  0.666667
5    6      B      B  0.666667
6    7      C      C  1.000000
7    8      C      C  1.000000
8    9      C      C  1.000000
9   10      D      F  1.000000
10  11      D      F  1.000000
11  12      D      F  1.000000
12  13      D      F  1.000000
13  14      D      F  1.000000

Вышеупомянутое решение касается согласованности обоих столбцов. Если вы хотите просто найти последовательность group1 над group2, тогда мы можем использовать

df.groupby('Group1')['Group2'].transform(lambda x : sum(x == x.name)/len(x)).replace(0,1)

Оцените статью
TechArks.Ru
Добавить комментарий