Pandas:将groupby中的唯一项添加到单独的行而不是数组

时间:2017-04-06 06:25:13

标签: python pandas numpy

在系列上使用unique()方法时,您会得到numpy数组,在groupby上执行此操作时也会发生这种情况。考虑这个例子:

import pandas as pd
L0 = ['G','i','G','h','j','h','G','j']
L1 = ['A','A','B','B','B','B','B','B']

df = pd.DataFrame({"A":L0,"B":L1})
dg = df.groupby('B').A.unique()

导致:

Out[56]: 
B
A       [G, i]
B    [G, h, j]
Name: A, dtype: object

我希望每个独特元素都在自己的行中:

   A
B   
A  G
A  i
B  G
B  h
B  j

我可以手动实现这一点(我故意省略对DataFrames的任何迭代,只使用底层的numpy数组):

de = pd.DataFrame(columns=["A","B"])
for i in range(dg.index.nunique()):
    ds = pd.Series(dg.values[i]).to_frame()
    ds.columns = ["A"]
    ds["B"] = dg.index.values[i]
    de = de.append(ds)
de = de.set_index('B')

但我想知道是否有一种不需要循环的短(快速)方式,创建新的Series或DataFrame,或者使用numpy数组。

如果没有,我可能会将其作为一项功能提出。

1 个答案:

答案 0 :(得分:1)

您可以将applySeries

一起使用
dg = df.groupby('B').A
       .apply(lambda x: pd.Series(x.unique()))
       .reset_index(level=1, drop=True)
       .to_frame()
print (dg)
   A
B   
A  G
A  i
B  G
B  h
B  j

另一种可能的解决方案是drop_duplicates

df = df.drop_duplicates(['A','B']).set_index('B')
print (df)
   A
B   
A  G
A  i
B  G
B  h
B  j