Сколько раз элемент был в списке до - PullRequest
1 голос
/ 16 июня 2020

Dataframe

data = {'col1':['a', 'b', 'b', 'c']}

#What I need:
data_with_new_feature = {'col1':['a', 'b', 'b', 'c'], 'col2':[0,0,1,0]}

Col2 описывает, сколько раз элемент был ранее в списке. У меня это именно в таком порядке, поэтому мне просто нужно найти col2. Столбец 2 читается следующим образом: «a» раньше было 0 раз в списке, «b» раньше было 0 раз в списке, «b» раньше было в списке, «c» никогда не было в списке до * 1004. *

Есть идеи, как это решить? Я пробовал использовать петли, но уверен, что есть способ получше.

Ответы [ 5 ]

3 голосов
/ 16 июня 2020

с l вашим col1 и count_list с col2
d = {} count_list = [] for c in l: if c in d: count_list.append(d[c]) d[c] += 1 else: d[c] = 0 count_list.append(d[c]) d[c] += 1

3 голосов
/ 16 июня 2020

Если вы действительно используете фрейм данных pandas (что несколько подразумевается в вашем вопросе) или если вы не против переключения на pandas, вы можете использовать groupby и cumcount:

import pandas as pd

df = pd.DataFrame({'col1':['a', 'b', 'b', 'c']})
df['col2'] = df.groupby('col1').cumcount()
print(df)

вывод:

  col1  col2
0    a     0
1    b     0
2    b     1
3    c     0
2 голосов
/ 16 июня 2020

Вы можете посчитать вхождения со словарем. И просто сложите текущий счетчик.

def cumulative_count(values):
    counts = {}
    output = []
    for value in values:
        counts.setdefault(value, 0)
        output.append(counts[value])
        counts[value] += 1
    return output


cumulative_count('abbc')
# [0, 0, 1, 0]
1 голос
/ 16 июня 2020

Решением O(n) было бы использовать collections.defaultdict для отслеживания текущих счетчиков, а затем добавлять увеличивающиеся счетчики к data по мере его итерации. В этом случае n будет количеством столбцов в data["col"].

from collections import defaultdict

data = {"col1": ["a", "b", "b", "c"]}

counts = defaultdict(int)
for item in data["col1"]:
    data.setdefault("col2", []).append(counts[item])
    counts[item] += 1

print(data)

Вывод:

{'col1': ['a', 'b', 'b', 'c'], 'col2': [0, 0, 1, 0]}

Если вам действительно нужно решение pandas (неоднозначно из вопроса, поскольку вы только что показали простой словарь) , тогда у @ jfaccioni есть хороший ответ, который вы можете использовать.

0 голосов
/ 16 июня 2020

Вы можете l oop более col1 элементов и подсчитать количество вхождений элементов в срезанных col1 (до текущего индекса):

data = {'col1':['a', 'b', 'b', 'c']}
data["col2"] = [data["col1"][:i].count(element) for i, element in enumerate(data["col1"])]
print(data)
# {'col1': ['a', 'b', 'b', 'c'], 'col2': [0, 0, 1, 0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...