python - Pandas :按组设置差异

标签 python pandas

我有一个非常大的数据集,其中包含每个月每个团队的成员。我想找到每个团队的增删改查。因为我的数据集非常大,所以我尝试尽可能多地使用内置函数。

我的数据集如下所示:

  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/

相关文章:

python - Pandas – 创建缓冲列

python - 比较来自不同 excel 文件的列,并在每个文件的开头添加一列与输出

python - 消除给定百分位数上的所有数据

python - 如何在 Python 中将正则表达式子模式与命名组一起使用?

python - 在 Keras 模型中 reshape 编码器解码器

Python 将字典中的值转换为元组

python - 对 Pandas 数据帧子集进行快速平均

python - 允许 Ctrl-C 中断 python C 扩展

python - 如何从 pandas 中所有列的字符串中提取数字并取数字的中位数?

python - 从 csv 列中提取最常见的组合