如果我有一些DataFrame:
A B
1 a
1 a
1 b
1 c
1 c
1 d
2 a
2 b
2 b
2 d
我可以使用groupby()
命令并计算每个唯一行的事件数。但现在,我不想算所有独特的线条。我想计算列B
中有多少唯一值对应列A
中的某个值。我现在的输出应该是
A UniqueValuesFromB
1 4
2 3
为此我做了下一个代码:
userNumber = []
items = []
for pos in df[column].unique():
dfEvent = df[df[column] == pos]
userNumber.append(len(numpy.unique(dfEvent[correspondingColumn])))
items.append(pos)
然后我从新列表中新建了新的DF ...有什么更好的方法来编码这个片段。特别是,我觉得我可以在这里使用groupby()
命令或类似命令。 请问,只有pythonic方式(或者一些熊猫功能的实现)才会被强烈的时间性能提升。
答案 0 :(得分:1)
使用groupby
和.nunique()
:
>>> df.groupby("A")["B"].nunique()
A
1 4
2 3
Name: B, dtype: int64
答案 1 :(得分:1)
使用value_counts
的另一种方法,此处的关键是将级别编号传递给count
:
In [32]:
df.groupby('A')['B'].apply(pd.value_counts).count(level=0)
Out[32]:
A
1 4
2 3
dtype: int64
另一种变体:
In [48]:
df.groupby('A')['B'].agg(lambda x: pd.Series.count(x.unique()))
Out[48]:
A
1 4
2 3
Name: B, dtype: int64