Сравнение строковых элементов в пределах временного ряда в Python - PullRequest
1 голос
/ 02 октября 2019

У меня есть следующий набор данных:

date       | name
2018-06-01 | John
2018-06-01 | Jake
2018-06-01 | Allan
2018-07-01 | Kate
2018-07-01 | Jake
2018-07-01 | Joe

(дата указана в качестве индекса)

Что я пытаюсь достичь: - для каждой группы периодов (например, aмесяц) - определить элементы (имена), которые были введены или удалены

Таким образом, результирующий набор данных, как я представляю, будет выглядеть так:

date       | action | name
2018-06-01 | Joiner | John
2018-06-01 | Joiner | Jake
2018-06-01 | Joiner | Allan
2018-07-01 | Joiner | Kate
2018-07-01 | Joiner | Joe
2018-07-01 | Withdrawal | John
2018-07-01 | Withdrawal | Allan

Я использую кадры данных Pandas. Полумологическое объяснение того, что я думаю, мне нужно сделать:

set = [] # resulting data set
for date, new_df in df.groupby(level=0): # breaking down the original set based the data into subsets
    for i in new_df: # iterating through each subset
        if (i in new_df-1): # comparing elements of each subset to the previous one
           set_element = {definition of a "joiner element"} 
           set.append(set_element) # adding an element to a resulting data set
        else:
            if (i not in new_df-1):
               set_element = {definition of a "withdrawal element"}
            else:
                pass

в тот момент, когда я получаю

"unsupported operand type(s) for -: 'str' and 'int'" 

Так что что-то подсказывает мне, что я не могу использовать наборы длясравнение строк ... или я сравниваю неправильные элементы ...

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Ваш вопрос сбивает с толку:

  • что вы пытаетесь сделать точно, какова логика преобразования первой таблицы во вторую?
  • типы значений в фрейме данных (и укажите, что вы работаете с фреймами данных Pandas :)). Я предполагаю, что это строки
  • {определение элемента Снятие}?

В любом случае я предполагаю, что значения в кадре данных являются строками. Когда вы пишете (new_df - 1), он пытается вычесть 1 из каждого значения в кадре данных. Это может сработать, если в фрейме данных содержатся такие числа, как int или double (тогда результатом будет фрейм данных, в котором все значения были вычтены на 1), но вы не можете «вычесть 1» из значений string в наборе данных,

0 голосов
/ 08 октября 2019

Я думаю, что смог решить это самостоятельно:

b = []
c = []
result = []
row = []
for date, new_df in df.groupby(level=0):
    a = set(new_df['name']).difference(b)
    for i in a:
        row = ({'date':date, 'action':'Joiner', 'name':i})
        result.append(row)  
    c = set(b).difference(set(new_df['name']))
    for i in c:
        row = ({'date':date, 'action':'Withdrawal', 'name':i})
        result.append(row)
    b = set(new_df['name'])

res_df = pd.DataFrame(data=result).set_index('date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...