Python Pandas 分组和 iloc。

3

我有一个包含数据列、客户列和大小的数据框,就像这样:

客户 日期 大小
Cust1 20/10/2021 4
Cust1 21/10/2021 5
Cust1 22/10/2021 6
Cust1 23/10/2021 6
Cust2 20/10/2021 4
Cust2 21/10/2021 5
Cust2 22/10/2021 6
Cust2 23/10/2021 6
Cust3 20/10/2021 4
Cust3 21/10/2021 5
Cust3 22/10/2021 6
Cust3 23/10/2021 6
我需要从客户中提取每个第n个日期并删除其余的。在这个例子中 - 每2个:
|Customer|Date|Size|
|--------|----|----|
|Cust1   |20/10/2021|4|
|Cust1   |22/10/2021|6|
|Cust2   |20/10/2021|4|
|Cust2   |22/10/2021|6|
|Cust3   |20/10/2021|4|
|Cust3   |22/10/2021|6|

对于糟糕的格式表示抱歉,但是表格格式不适用于第二个表格。

实际上,它是从最近的一天开始的每10天。 尝试使用group和iloc,但不起作用:

df_10 = df.iloc[::10, :]

AttributeError: 'DataFrameGroupBy' object has no attribute 'iloc'

说实话,我并不坚持一定要使用groupby,但是到目前为止还没有找到可行的解决方案。

谢谢


2
你能否包含导致错误的代码? - osbm
2
你能提供一个真实的例子,包括实际日期(即使使用虚拟数据),以及相应的输出吗? - mozway
2个回答

3

您可以使用:

df.loc[df.groupby('Customer').cumcount().mod(2).eq(0)]

输出:

   Customer        Date  Size
0     Cust1  20/10/2021     4
2     Cust1  22/10/2021     6
4     Cust2  20/10/2021     4
6     Cust2  22/10/2021     6
8     Cust3  20/10/2021     4
10    Cust3  22/10/2021     6

解释:

df.groupby('Customer').cumcount() 创建每个分组的计数([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]),然后 mod(2) 取模以得到 [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],并且 eq(0) 使得我们能够选择0值。

如果你想要从第K个行开始每隔N个行取一个: .mod(N).eq(K)


@YavorI 这是一个与问题无关的问题,你做错了什么。你必须要有一个 DataFrame。原始数据是什么?你如何创建 df - mozway
你解决了DataFrameGroupBy的问题了吗? ;) - mozway

2
也许这可以帮到您? 使用pandas标记每个组的第N行 对于类似于您的数据集,一种解决方案可能是:
df= pd.DataFrame({'Customer': ['Cust1']*20 + ['Cust2']*20,
         'date': range(1,40+1),
         'size':[10]*40})
n=3 # for every 3th row
df.groupby('Customer', group_keys=False).apply(lambda x: x.iloc[n-1::n])

´´´


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接