我有一个包含三行的数据框。 “ ID”是一个人的唯一标识符。 “ Group1”和“ Group2”是组标识符。

例如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 |

我想知道小组之间的一致性。是以前在组中的相同成员吗?

因此,基于组内人员,A组的75%是一致的。 B组的66.6%是一致的。 C组的100%和D组的100%的成员与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构成了另一个组以及组2 BD BD GH A G的33%。
对于ID 9到13,我想说的是,第2组AB由60%的相同人员组成。我想说的是第2组DF DC(ID 14),该组包含33%的相同人员。

ID Group1 Group2 Cons0 A001 BD BD GH A BD BD GH A 0.3333331 A002 BD BD GH A BD BD GH A 0.3333332 A003 BD BD GH A BD BD GH A 0.3333333 A004 BD BD GH A BD BD GH A G 0.3333334 A005 BD BD GH A BD BD GH A G 0.3333335 A006 BD BD GH A BD BD GH A G 0.3333336 A007 BD BD GH A BD BD GH A F 0.3333337 A008 BD BD GH A BD BD GH A F 0.3333338 A009 BD BD GH A BD BD GH A F 0.3333339 A010 AB AB 0.60000010 A011 AB AB 0.60000011 A012 AB AB 0.60000012 A013 DF DC AB 0.60000013 A014 DF DC AB 0.60000014 A015 DF DC DF DC 0.33333315 A016 AB CDE FGHI-JSHD JS AN CDE FGHI-JSHD JS 1.00000016 A017 HD MV APS MG HD NV ALS BA HDJ 1.00000017 A018 LA JF NV WJ LA JF NV OHB 1.000000

我觉得从现在开始这只是一小步,但是我不知道如何调整两个代码中的任何一个来解决我的问题。

我希望这有助于澄清我的问题。如果对此不清楚,我很抱歉。

再次非常感谢您的帮助。

最佳答案

您可以将groupbytransform与自定义一致性功能一起使用。首先,创建一些示例数据(注意:在示例中,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_countsmax结合使用。

定义一致性函数

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

    return max_common / size


分组和转换

接下来,我们将源组(G_Source)分组,并通过transform.计算目标组(G_Target)的一致性

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

10-07 15:08