比较 Python 中时间序列中的字符串元素

Comparing string elements within a time series in Python

我有以下数据集:

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

(以日期为索引)

我想要实现的是: - 对于每个时期组(例如一个月) - 确定引入或移除的元素(名称)

所以我想象的结果数据集看起来像:

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'" 

有些东西告诉我我不能使用集合进行字符串比较...或者我正在比较错误的元素...

您的问题令人困惑,表现在以下几个方面:

  • 你到底想做什么,将第一个 table 转换为第二个的逻辑是什么?
  • 数据框中的值类型是什么(并且声明您正在使用 Pandas 数据框 :))。我假设它们是字符串
  • {取款要素的定义} ?

无论如何,我假设数据框中的值是字符串。当您编写 (new_df - 1) 时,它会尝试从数据帧中的每个值中减去 1。如果数据框包含 intdouble 之类的数字(那么,结果将是一个数据框,其中所有值都减去 1),这可能会起作用,但是您不能 "subtract 1" 从 string 数据集中的值。

我认为我自己能够稍微解决它:

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')