来自某些列DF DF的唯一值

时间:2014-10-06 12:18:23

标签: python pandas for-loop dataframe

如果我有一些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方式(或者一些熊猫功能的实现)才会被强烈的时间性能提升。

2 个答案:

答案 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