分组操作后访问原始索引

时间:2015-03-16 08:03:03

标签: python pandas dataframe indexing pandas-groupby

有一个带有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的所有行,然后合并这些值。对于大型表来说,这是非常慢的。我还可以对{A}和B列使用.unique()并迭代所有组合,分别创建向量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的索引组。 请帮忙?

2 个答案:

答案 0 :(得分:2)

你可以不使用groupby来做到这一点,只需使用字符串+表示连接的事实,并且pandas在元素上执行元素:

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

答案 1 :(得分:0)

@joris - 非常感谢你。 当然,它确实有效!快点,我需要补充: - )

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

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

再次感谢!