比较 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。如果数据框包含 int
或 double
之类的数字(那么,结果将是一个数据框,其中所有值都减去 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')
我有以下数据集:
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。如果数据框包含 int
或 double
之类的数字(那么,结果将是一个数据框,其中所有值都减去 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')