我想按 Branch
和 Buyer
对 dfx
进行分组,获取 Quantity
为中间值的行每个子数据帧,并返回最终数据帧。如何在 Date
列中保留相应的值?
dfx
:
Branch Buyer Quantity Date
0 A Carl 1 2013-01-01 13:00:00
1 A Mark 3 2013-01-01 13:05:00
2 A Carl 5 2013-10-01 20:00:00
3 A Carl 1 2013-10-02 10:00:00
4 A Joe 8 2013-10-01 20:00:00
5 A Joe 1 2013-10-02 10:00:00
6 A Joe 9 2013-12-02 12:00:00
7 B Carl 3 2013-12-02 14:00:00
可重现的示例:
dfx = pd.DataFrame({'Branch': 'A A A A A A A B'.split(),
'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(),
'Quantity': [1, 3, 5, 1, 8, 1, 9, 3],
'Date': [
datetime.datetime(2013, 1, 1, 13, 0),
datetime.datetime(2013, 1, 1, 13, 5),
datetime.datetime(2013, 10, 1, 20, 0),
datetime.datetime(2013, 10, 2, 10, 0),
datetime.datetime(2013, 10, 1, 20, 0),
datetime.datetime(2013, 10, 2, 10, 0),
datetime.datetime(2013, 12, 2, 12, 0),
datetime.datetime(2013, 12, 2, 14, 0)]
})
使用:
grouped1 = dfx.groupby(['Branch', 'Buyer'])
grouped1['Quantity'].apply(lambda x: x.iloc[0])
返回:
Branch Buyer
A Carl 1
Joe 8
Mark 3
B Carl 3
Name: Quantity, dtype: int64
但不保留日期
。
数量中的中间值的预期输出:
Branch Buyer Quantity Date
0 A Carl 1 2013-01-01 13:00:00
1 A Mark 3 2013-01-01 13:05:00
4 A Joe 8 2013-10-01 20:00:00
7 B Carl 3 2013-12-02 14:00:00
对于(A,Carl)
,只有两个唯一值1
和5
,但是1
首先出现,所以保留这一行。 (A,Joe)
有 8, 1, 9
,因此保留中间值为 8
的行。 (A,Mark)
和 (B,Carl)
总共只有一行,因此保留原始数据。
最佳答案
要获取 Quantity 的中间元素,您可以将第一个和最后一个索引除以 2 以获得中间索引。对应于数量的值,您只需指定列名称即可获得日期列,即如上所示的 groupby 之后的日期。
关于python - 在 groupby 和操作子数据帧之后保持其他列值不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62805813/