【问题标题】:Accessing the original index after group-by operation分组操作后访问原始索引
【发布时间】:2015-05-18 06:51:13
【问题描述】:

有一个包含 A 列和 B 列的 DF,我想添加额外的 C 列,其中将包括每行 A 和 B 值的组合。即,如果我有 DF:

   A B 
0  1 1
1  1 2
2  2 1
3  2 2

我想创建:

   A B C
0  1 1 1_1
1  1 2 1_2
2  2 1 2_1
3  2 2 1_2

显然,我可以遍历 DF 的所有行并合并这些值。这对于大桌子来说非常慢。我还可以将 .unique() 用于列 A 和 B 并遍历所有组合,分别创建向量 col1_uncol2_un,然后使用类似

的方式更新表中的相关索引
    cols_2_merge = ['A','B']
    col1_un = DF[cols_2_merge[0]].unique()
    col2_un = DF[cols_2_merge[1]].unique()
    for i in range(len(col1_un)):
        try:
            ind1 = np.where(DF[cols_2_merge[0]].str.contains(col1_un[i], na=False))[0]
        except:
            ind1 = np.where(DF[cols_2_merge[0]] == col1_un[i])[0]
        for j in range(len(col2_un)):
            try:
                ind2 = np.where(DF[cols_2_merge[1]].str.contains(col2_un[j], na=False))[0]
            except:
                ind2 = np.where(DF[cols_2_merge[1]] == col2_un[j])[0]

            new_ind = col1_un[i] + '-' + col2_un[j]
            tmp_ind = np.in1d(ind1, ind2)
            ind = ind1[tmp_ind]
            if len(ind) > 0:
                DF[new_col_name][ind] = new_ind

这仍然很慢。我可以更多地使用它,而不是搜索整个 DF,而是将搜索字段减少到迄今为止未更改的索引。仍然很慢。

有一个 group by 选项正是我想要的,找到两列的所有唯一组合对,它相对较快,但我还没有弄清楚如何访问每个原始 DF 的索引团体。 请帮忙?

【问题讨论】:

  • 这行得通吗:df['C'] = df['A'].astype(str) + '_' + df['B'].astype(str)?
  • 2 2如何变成1_2
  • 它应该是 2_2 - type ;-(
  • @user3861925 然后把它放在答案中

标签: python pandas dataframe indexing pandas-groupby


【解决方案1】:

您可以在不使用 groupby 的情况下做到这一点,只需使用字符串 + 表示连接的事实,而 pandas 在系列上按元素执行此操作:

df['C'] = df['A'].astype(str) + '_' + df['B'].astype(str)

【讨论】:

    【解决方案2】:

    @joris - 非常感谢。 当然,它确实有效!快,我需要添加:-)

    对于更复杂的基于组的组合,可以使用

    GB = DF[cols_2_merge].groupby(cols_2_merge)
    for i in GB.groups:
        DO WHATEVER YOU WANT...
    

    再次感谢!

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2015-09-04
      • 1970-01-01
      • 2019-09-07
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多