我有一个包含 N 列整数对象值的熊猫数据框。列中的值与特定随机实验的结果相关联。例如,如果我要调用 df.head():
0 1 2 3
0 13 4 0 5
1 8 2 16 6
2 6 20 14 0
3 17 4 8 4
4 17 2 12 0
我感兴趣的是确定特定列中每个唯一值出现的次数。仅考虑第 0 列,我可能希望知道我在这个实验中观察到值“17”的次数,在我们上面的框中,我们可以看到这在第 0 列的前 5 个条目中发生了两次。
通过 Pandas 本身或其他方式执行此操作的最佳方法是什么?
我考虑的第一种方法是将该列折叠到一个字典中,其中键是观察到的数据值,字典值与该特定键的计数相关联。我使用了 Python Collections 中的 Counter 数据结构。
# converting the Dataset into a Pandas Dataframe
df = pd.read_csv("newdataset.txt",
header=None,
#skiprows=0,
delim_whitespace=True)
print(df.head())
user0Counter = Counter()
for dataEntry in df[0]:
user0Counter.update(dataEntry)
这会导致类型错误。
TypeError Traceback (most recent call last)
<ipython-input-15-d2a83c38d0d0> in <module>
----> 1 import codecs, os;__pyfile = codecs.open('''~/dir/foo/bar.py''', encoding='''utf-8''');__code = __pyfile.read().encode('''utf-8''');__pyfile.close();exec(compile(__code, '''~/dir/foo/bar.py''', 'exec'));
~/dir/foo/bar.py in <module>
28
29 for dataEntry in df[0]:
---> 30 user0Counter.update(dataEntry)
31
32 print(len(user0Counter))
~/anaconda3/lib/python3.7/collections/__init__.py in update(*args, **kwds)
651 super(Counter, self).update(iterable) # fast path when counter is empty
652 else:
--> 653 _count_elements(self, iterable)
654 if kwds:
655 self.update(kwds)
TypeError: 'int' object is not iterable
如果我用 print(dataEntry) 块替换 user0Counter.update() 方法,则迭代 df[0] 没有问题。
0 1 2 3
0 13 4 0 5
1 8 2 16 6
2 6 20 14 0
3 17 4 8 4
4 17 2 12 0
13
8
6
17
17
1
1
4
6
19
3
11
3
4
12
7
1
9
4
2
1
2
5
1
2
13
等等。