Итерация по столбцу Pandas Dataframe и добавление его элементов к объекту Python Collections Counter - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть pandas массив данных из 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, я могу sh узнать, сколько раз я наблюдал значение '17' в этом эксперименте, и в нашем окне выше мы можем видеть, что это происходило дважды по сравнению с первыми 5 записями в столбце 0 .

Каков оптимальный способ сделать это, через Pandas сам или иным образом?

Первый подход, который я рассмотрел, состоял в том, чтобы свернуть этот столбец в Словарь, где ключ - это наблюдаемое значение данных, а значение словаря связано со счетчиком этого конкретного ключа. Я использовал структуру данных Counter из Python Collections.

# 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

Если заменить метод user0Counter.update () на print ( dataEntry), нет итерации по 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

и т. д.

1 Ответ

0 голосов
/ 04 апреля 2020

Вы можете использовать pandas напрямую.

import pandas as pd

df['col_frequency'] = df.groupby(['col_to_count'])['col_to_count'].count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...