使用pandas识别组设置的更改

时间:2017-11-03 12:41:49

标签: python pandas pandas-groupby

我有一个包含三行的数据框。 ' 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

我觉得这是从现在开始的一小步,但我无法弄清楚如何调整两个代码中的任何一个来解决我的问题。

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

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您可以将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

Groupby和transform

接下来,我们按源组(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

答案 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)