【发布时间】:2015-02-19 01:08:15
【问题描述】:
对于 DataFrame 中的每一行数据,我想计算该特定行的列 A 和 B 中唯一值的数量,以及由另一列 ID 标识的组中的参考行。这是一个玩具数据集:
d = {'ID' : pd.Series([1,1,1,2,2,2,2,3,3])
,'A' : pd.Series([1,2,3,4,5,6,7,8,9])
,'B' : pd.Series([1,2,3,4,11,12,13,14,15])
,'REFERENCE' : pd.Series([1,0,0,0,0,1,0,1,0])}
data = pd.DataFrame(d)
数据如下:
In [3]: data
Out[3]:
A B ID REFERENCE
0 1 1 1 1
1 2 2 1 0
2 3 3 1 0
3 4 4 2 0
4 5 11 2 0
5 6 12 2 1
6 7 13 2 0
7 8 14 3 1
8 9 15 3 0
现在,在使用 ID 定义的每个组中,我想将每条记录与参考记录进行比较,并且我想计算组合的唯一 A 和 B 值的数量。例如,我可以通过取 len(set([4,4,6,12])) 来计算数据记录 3 的值,得到 3。结果应该如下所示:
A B ID REFERENCE CARDINALITY
0 1 1 1 1 1
1 2 2 1 0 2
2 3 3 1 0 2
3 4 4 2 0 3
4 5 11 2 0 4
5 6 12 2 1 2
6 7 13 2 0 4
7 8 14 3 1 2
8 9 15 3 0 3
我能想到实现这一点的唯一方法是使用循环遍历每个分组对象,然后循环分组对象中的每个记录,并根据参考记录计算它。这是非pythonic并且非常慢。任何人都可以建议一种矢量化方法来实现相同的目标吗?
【问题讨论】:
-
您的数据似乎属于组。您是否考虑过在加载到 Pandas 之前对数据进行预分组?
-
@ericmjl 你的意思是有多少组就有多少个数据框?像
data.groupby('ID')这样的事情不是更好吗? -
我正打算确切地建议你提到的内容。
标签: python-2.7 pandas split-apply-combine