我有一个包含三行的数据框。 ' ID'是一个人的唯一标识符。 '组1'和' Group2'是组标识符。
e.g。 ID4已经在B组,现在在A组。
d = df.set_index('Guest').to_dict(orient='index')
d_final = {32: j}
import json
with open('result.json', 'w') as fp:
json.dump(d, fp)
我想知道,这些群体的一致性如何。是否曾经在一个小组中的同一成员再次出现在一个小组中?
因此,基于该群体中的人,75%的A群是一致的。 B组66.6%是一致的。 C组100%和D组100%成员与F组成员相同。
这将导致:
| 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 |
请你帮我解决一下如何实现我的目标?我试过了
| 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 |
,但那不起作用。
感谢您的帮助
修改
非常感谢你的帮助。我尝试了更多的数据,但仍有一点问题。确保:参与者只能从Group1切换到Group2
这是一些更多的数据和我想要的。如您所见(以及ID 4中的上表),应该清楚新组2 pct_change
占另一组的33%,以及第2组BD BD GH A
。
对于ID 9到13,我希望能够说,第2组BD BD GH A G
占60%的同一个人。对于Group2 AB
(ID 14),我希望能够说,这个群体占33%的同一群体。
DF DC
我觉得这是从现在开始的一小步,但我无法弄清楚如何调整两个代码中的任何一个来解决我的问题。
我希望这有助于澄清我的问题。如果我对此不清楚,我很抱歉。
非常感谢你的帮助。
答案 0 :(得分:1)
您可以将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)进行分组,并通过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 :(得分:0)
我们可以在这里使用两个groupby,因为你想根据两列找到一致性,即
# 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
上述解决方案处理两列的一致性。如果你想在group2上找到group1的一致性,那么我们可以使用
df.groupby('Group1')['Group2'].transform(lambda x : sum(x == x.name)/len(x)).replace(0,1)