![](/img/trans.png)
[英]Pandas - create a new DataFrame from first n groups of a groupby operation
[英]Select values in Pandas groupby dataframe that are present in n previous groups
我有一个Pandas数据groupby
对象,如下所示:
ID
2014-11-30 1
2
3
2014-12-31 1
2
3
4
2015-01-31 2
3
4
2015-02-28 1
3
4
5
2015-03-31 1
2
4
5
6
2015-04-30 3
4
5
6
我想做的是创建另一个数据框,其中groupby日期x中的值是在groupby日期y(x-1)至y(xn)中的每个值,其中y是上一个groupby的n期。 因此,例如,如果n = 1,则如果x groupby period为'2015-04-30',则应对照'2015-03-31'。 如果n = 2,则如果分组日期为'2015-02-28',则应对照分组日期['2015-01-31','2014-12-31']进行检查。
从上面得到的数据帧对于n = 1如下所示:
ID
2014-12-31 1
2
3
2015-01-31 2
3
4
2015-02-28 3
4
2015-03-31 1
4
5
2015-04-30 4
5
6
n = 2的结果数据帧为:
2015-01-31 2
3
2015-02-28 3
4
2015-03-31 4
2015-04-30 4
5
期待一些pythonic解决方案!
这似乎可行:
def filter_unique(df, n):
data_by_date = df.groupby('date')['ID'].apply(lambda x: x.tolist())
filtered_data = {}
previous = []
for i, (date, data) in enumerate(data_by_date.items()):
if i >= n:
if len(previous)==1:
filtered_data[date] = list(set(previous[i-n]).intersection(data))
else:
filtered_data[date] = list(set.intersection(*[set(x) for x in previous[i-n:]]).intersection(data))
else:
filtered_data[date] = data
previous.append(data)
result = pd.DataFrame.from_dict(filtered_data, orient='index').stack()
result.index = result.index.droplevel(1)
filter_unique(df, 2)
1/31/15 2
1/31/15 3
1/31/15 4
11/30/14 1
11/30/14 2
11/30/14 3
12/31/14 2
12/31/14 3
2/28/15 1
2/28/15 3
3/31/15 1
3/31/15 4
4/30/15 4
4/30/15 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.