以下是数据框
for(Map.Entry<Integer,String> entry:map1.entrySet()){
qaMap.put(entry.getValue(),map2.get(entry.getKey()));
}
预期产出:
Date Name data
01/01/2017 Alpha A
02/01/2017 Alpha A
03/01/2017 Alpha B
01/01/2017 Beta A
01/20/2017 Beta D
03/01/2017 Beta C
04/01/2017 Beta C
05/01/2017 Beta B
我正在寻找&#34;数据&#34;的独特数量。分组&#34;名称&#34;在3个月的滚动基础上。考虑&#34; 2017年3月&#34;的例子。和&#34;姓名&#34; - &GT; &#34;β&#34 ;.所以考虑的月份是2017年1月,2017年2月,2017年3月的名称&#34; Beta&#34;。唯一计数为3.与其他人类似。 请注意&#34;数据&#34;这3个月应该是唯一的
感谢任何帮助。
答案 0 :(得分:1)
每月组Name
,取消堆叠并重新采样到月份,因此所有月份都存在,每个Name
df2 = df.groupby([pd.TimeGrouper('M'), 'Name', ])['data'].apply(set).unstack().resample('M').sum()
DF2
Name Alpha Beta
Date
2017-01-31 {A} {A, D}
2017-02-28 {A} None
2017-03-31 {B} {C}
2017-04-30 None {C}
2017-05-31 None {B}
一些itertools魔法在同一列上多次迭代
def multiple_iterator(iterable, r=2):
iterators = itertools.tee(iterable, r)
try:
for i, it in enumerate(iterators):
for j in range(i):
next(it)
except StopIteration:
return None
return iterators
def get_unique_items_rolling(df, period):
for col_name, col in df2.iteritems():
s = pd.Series()
# print(f'---{col_name}---')
for idx, *iterators in zip(col.index[period-1:], *multiple_iterator(col, period)):
result = set(itertools.chain.from_iterable(i for i in iterators if pd.notnull(i) and i))
# print(idx, result)
s[idx] = result
yield col_name, s
df3 = pd.DataFrame.from_items(get_unique_items_rolling(df2, period))
Alpha Beta
2017-03-31 {A, B} {A, D, C}
2017-04-30 {A, B} {C}
2017-05-31 {B} {B, C}
df3.stack().apply(len)
Date Name
2017-03-31 Alpha 2
Beta 3
2017-04-30 Alpha 2
Beta 1
2017-05-31 Alpha 1
Beta 2
dtype: int64