我有一个包含数千行和4列的pandas数据框。即:
A B C D
1 1 2 0
3 3 2 1
3 1 1 0
....
有没有办法计算某一行发生的次数?例如,可以找到[3,1,1,0]多少次,并返回那些行的索引?
答案 0 :(得分:4)
如果你只想找一行,那么我可能会做类似
的事情>>> df.index[(df == [3, 1, 1, 0]).all(axis=1)]
Int64Index([2, 3], dtype=int64)
-
说明如下。从:
开始>>> df
A B C D
0 1 1 2 0
1 3 3 2 1
2 3 1 1 0
3 3 1 1 0
4 3 3 2 1
5 1 2 3 4
我们与目标进行比较:
>>> df == [3,1,1,0]
A B C D
0 False True False True
1 True False False False
2 True True True True
3 True True True True
4 True False False False
5 False False False False
找到匹配的:
>>> (df == [3,1,1,0]).all(axis=1)
0 False
1 False
2 True
3 True
4 False
5 False
并使用此布尔系列从索引中进行选择:
>>> df.index[(df == [3,1,1,0]).all(axis=1)]
Int64Index([2, 3], dtype=int64)
如果你没有计算一行的出现次数,而是你想对每一行重复这样做,所以你真的想要同时找到所有的行,那么比一次又一次地做上述行更快。但这应该可以很好地用于一行。
答案 1 :(得分:1)
首先创建一个示例数组:
>>> import numpy as np
>>> x = [[1, 1, 2, 0],
... [3, 3, 2, 1],
... [3, 1, 1, 0],
... [0, 1, 2, 3],
... [3, 1, 1, 0]]
然后创建一个数组视图,其中每一行都是一个元素:
>>> y = x.view([('', x.dtype)] * x.shape[1])
>>> y
array([[(1, 1, 2, 0)],
[(3, 3, 2, 1)],
[(3, 1, 1, 0)],
[(0, 1, 2, 3)],
[(3, 1, 1, 0)]],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')])
对要查找的元素执行相同的操作:
>>> e = np.array([[3, 1, 1, 0]])
>>> tofind = e.view([('', e.dtype)] * e.shape[1])
现在你可以寻找元素了:
>>> y == tofind[0]
array([[False],
[False],
[ True],
[False],
[ True]], dtype=bool)
答案 2 :(得分:1)
你也可以使用MultiIndex,当它被排序时,找到计数的速度会更快:
s = StringIO("""A B C D
1 1 2 0
3 3 2 1
3 1 1 0
3 1 1 0
3 3 2 1
1 2 3 4""")
df = pd.read_table(s,delim_whitespace=True)
s = pd.Series(range(len(df)), index=pd.MultiIndex.from_arrays(df.values.T))
s = s.sort_index()
idx = s[3,1,1,0]
print idx.count(), idx.values
输出:
2 [2 3]