python - 在 Pandas 中,如何获取截至时间 T 的唯一值的数量?

标签 python pandas

考虑以下数据集

df=pd.DataFrame({'A':pd.date_range('2012-02-02','2012-02-07'),
                 'ID':['A','B','A','D','A',np.NaN]})      

df
Out[122]: 
           A    ID
0 2012-02-02    A
1 2012-02-03    B
2 2012-02-04    A
3 2012-02-05    D
4 2012-02-06    A
5 2012-02-07  NaN

我想获取截至时间 t 的 ID 唯一值的数量。这意味着输出应该类似于

Out[122]: 
           A    uniqueID
0 2012-02-02    1
1 2012-02-03    2
2 2012-02-04    2
3 2012-02-05    3
4 2012-02-06    3
5 2012-02-07    3

事实上,在 2 月 3 日,我们知道 ID 有两个唯一值(“A”和“B”)。 2 月 4 日,我们看到“A”,但我们已经知道这一点,因此我们不会增加唯一 ID 值的计数。

我没有看到使用 groupby.agg('nunique') 执行此操作的简单方法。欢迎任何想法。

谢谢!

编辑:

尝试了解 edchum 解决方案...

df.apply(lambda x: df['ID'].iloc[:x.name+1],axis=1)
Out[134]: 
   0    1    2    3    4   5
0  A  NaN  NaN  NaN  NaN NaN
1  A    B  NaN  NaN  NaN NaN
2  A    B    A  NaN  NaN NaN
3  A    B    A    D  NaN NaN
4  A    B    A    D    A NaN
5  A    B    A    D    A NaN

最佳答案

apply 一个 lambda,该 lambda 使用 loc 对 df 进行切片,并使用 .name 对行索引值进行切片,并计算 nunique ID 列计数:

In [5]:
df['Unique_ID'] = df.apply(lambda x: df['ID'].loc[:x.name].nunique(),axis=1)
df
Out[5]:
           A   ID  Unique_ID
0 2012-02-02    A          1
1 2012-02-03    B          2
2 2012-02-04    A          2
3 2012-02-05    D          3
4 2012-02-06    A          3
5 2012-02-07  NaN          3

编辑

这里有一个分割,如果我们修改 df,使索引不是 int 生成的索引:

In [19]:
df=pd.DataFrame({'A':pd.date_range('2012-02-02','2012-02-07'),
                 'ID':['A','B','A','D','A',np.NaN]}, index=list('abcdef'))  
df

Out[19]:
           A   ID
a 2012-02-02    A
b 2012-02-03    B
c 2012-02-04    A
d 2012-02-05    D
e 2012-02-06    A
f 2012-02-07  NaN

因此我们看到,在本例中,name 实际上是行系列索引值:

In [20]:
df.apply(lambda x: print(x.name),axis=1).tolist()

a
b
c
d
e
f

因此,我们可以使用 loc 来对 df 进行切片,范围不超过此索引值(包括该索引值):

In [22]:
df.apply(lambda x: print(df['ID'].loc[:x.name]),axis=1)

a    A
Name: ID, dtype: object
a    A
b    B
Name: ID, dtype: object
a    A
b    B
c    A
Name: ID, dtype: object
a    A
b    B
c    A
d    D
Name: ID, dtype: object
a    A
b    B
c    A
d    D
e    A
Name: ID, dtype: object
a      A
b      B
c      A
d      D
e      A
f    NaN
Name: ID, dtype: object

因此,您可以从上面看到,我们正在增加每行的切片范围,然后我们可以对此调用 nunique 以返回在此范围内看到的唯一值的数量:

In [24]:
df.apply(lambda x: print(df['ID'].loc[:x.name].nunique()),axis=1)

1
2
2
3
3
3

关于python - 在 Pandas 中,如何获取截至时间 T 的唯一值的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516776/

相关文章:

python - 如何在具有两个 DataFrame 的 Pandas 中使用替换?

python - 将 DataFrame Pandas 中第二行的列分类到第一行?

python - 使用 pandas 有效计算剩余使用生命周期

python - 通过参数确定绘图平滑度

python - 在 'key' 类型参数中动态传递 'key=value'

python - 用计算向前填充 DataFrame/数组的更好方法?

python - 使用chdir后找不到任何文件或目录

python - Pandas 数据透视表中的平均值

python - 在多个 python pandas 数据帧中查找记录

python - 什么时候获取 numpy 数组的子矩阵返回 View 而不是复制?