这个问题是我的进一步的进步前一个 https://stackoverflow.com/questions/51808294/pandas-find-rows-with-matching-values-in-two-columns-and-multiply-value-in-ano:
我编辑了表格,这样会减少混乱
首先假设我们有一个数据框如下:
data = pd.DataFrame({'id':['1','2','3','4','5','6','7','8','9','10'],
'A':['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo','foo','bar'],
'C':['10','10','10','50','50','50','50','8','10','20'],
'D':['10','9','8','7','6','5','4','3','2','1']})
如下:
A C D id
0 foo 10 10 1
1 bar 10 9 2
2 foo 10 8 3
3 bar 50 7 4
4 foo 50 6 5
5 bar 50 5 6
6 foo 50 4 7
7 foo 8 3 8
8 foo 10 2 9
9 bar 20 1 10
我想做的是找到匹配行,然后进行一些计算。
for any two ids(idx, idy) in data.iterrows():
if idx.A == idy.A and idx.C = idy.C:
result = idx.D * idy.D
然后生成一个包含三列的新数据框['id']
, ['A']
and ['result']
.
@Jon Clements♦ 用以下非常简洁的代码回答了我之前的问题:
df.merge(
df.groupby(['A', 'C']).D.agg(['prod', 'count'])
[lambda r: r['count'] > 1],
left_on=['A', 'C'],
right_index=True
)
新目标:
现在我想知道是否有一种方法可以在与 row_b 匹配后不再迭代 row_a 。换句话说,我将这两个匹配行视为一对。一旦 row_a 和 row_b 成为一对,进一步的循环将忽略 row_a(不会忽略 row_b,直到 row_b 与另一行匹配)。
Take groupby().agg('prod', 'count')
以函数为例,我希望'count'
生成的所有结果中有 2 个(不仅仅是带有['count'] == 2
)。我认为这不会使用groupby()
所以我想像for循环这样的机制可以解决这个问题吗?或者有什么更好的方法吗?
所以现在的预期结果是(因为 id1 和 id3 已经成为一对,所以它不会聚合到 id9,并且对于其余迭代 id3 将不会与 id1 匹配。因此对于下表,第一行的结果是 80 但不是 160 ,第二行也不是):
id A result
0 1 foo 80
1 3 foo 16
2 4 bar 35
3 5 foo 24
我的英语不是很好,所以我不确定我是否清楚地解释了我的问题。如果有什么不清楚的地方可以问我。
谢谢你的帮助。