我有一个非常大的数据集,其中包含每个月每个团队的成员。我想找到每个团队的增删改查。因为我的数据集非常大,所以我尝试尽可能多地使用内置函数。
我的数据集如下所示:
month team members
0 0 A X, Y, Z
1 1 A X, Y
2 2 A W, X, Y
3 0 B D, E
4 1 B D, E, F
5 2 B F
由以下代码生成:
num_months = 3
num_teams = 2
obs = num_months*num_teams
df = pd.DataFrame({"month": [i % num_months for i in range(obs)],
"team": ['AB'[i // num_months] for i in range(obs)],
"members": ["X, Y, Z", "X, Y", "W, X, Y", "D, E", "D, E, F", "F"]})
df
结果应该是这样的:
month team members additions deletions
0 0 A X, Y, Z None None
1 1 A X, Y None Z
2 2 A W, X, Y W None
3 0 B D, E None None
4 1 B D, E, F F None
5 2 B F None D, E
或在 Python 代码中
df = pd.DataFrame({"month": [i % num_months for i in range(obs)],
"team": ['AB'[i // num_months] for i in range(obs)],
"members": ["X, Y, Z", "X, Y", "W, X, Y", "D, E", "D, E, F", "F"],
"additions": [None, None, "W", None, "F", None],
"deletions": [None, "Z", None, None, None, "D, E"]
})
立即想到的一种技术是创建一个显示 lagged value of members in each group 的新列,然后取两列之间的差值(双向)。
有没有办法使用 pandas 内置函数来设置列之间的差异?
我应该尝试其他技巧吗?
最佳答案
使用set
, groupby
, apply
, 和 shift
.
- 为了提高效率:
- 将
members
转换为set
类型,因为-
是不受支持的操作数,这将导致TypeError
。 - 将
添加
和删除
保留为集
类型
- 将
使用应用
- 使用 60000 行的数据框:
每次循环 91.4 毫秒 ± 2.77 毫秒(7 次运行的平均值 ± 标准偏差,每次 10 次循环)
# clean the members column
df.members = df.members.str.replace(' ', '').str.split(',').map(set)
# create del and add
df['deletions'] = df.groupby('team')['members'].apply(lambda x: x.shift() - x)
df['additions'] = df.groupby('team')['members'].apply(lambda x: x - x.shift())
# result
month team members additions deletions
0 A {Z, X, Y} NaN NaN
1 A {X, Y} {} {Z}
2 A {W, X, Y} {W} {}
0 B {D, E} NaN NaN
1 B {D, F, E} {F} {}
2 B {F} {} {D, E}
更高效
-
pandas.DataFrame.diff
- 使用 60000 行的数据框:
每次循环 60.7 毫秒 ± 3.54 毫秒(7 次运行的平均值 ± 标准偏差,每次 10 次循环)
df['deletions'] = df.groupby('team')['members'].diff(periods=-1).shift()
df['additions'] = df.groupby('team')['members'].diff()
关于python - Pandas :按组设置差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61807790/