在系列上使用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
数组。
如果没有,我可能会将其作为一项功能提出。
答案 0 :(得分:1)
您可以将apply
与Series
:
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