gpt4 book ai didi

python - Pandas - 在多列中查找并迭代具有匹配值的行,并在另一列中乘以值

转载 作者:行者123 更新时间:2023-11-28 18:09:09 24 4
gpt4 key购买 nike

这个问题比我的previous one更进一步:

我编辑了表格以减少混淆

首先假设我们有一个数据框如下:

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']['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)。

groupby().agg('prod', 'count')函数为例,希望生成的所有结果的'count'都是2(不仅仅是带有 ['count'] == 2 的过滤器)。我不认为这会使用 groupby() 所以我认为像 for-loop 这样的机制可以解决这个问题?还是有更好的方法?

所以现在的预期结果是(因为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

我的英语不是很好,所以我不确定我是否清楚地解释了我的问题。有什么不清楚的可以问我。

感谢您的帮助。

最佳答案

有点冗长的解决方案,远不及 Jon Clements 针对您的第一个问题的原始解决方案那么优雅。但我想出了一个不需要 for 循环的解决方案。

# sort values by A,C,id
df = df.sort_values(['A','C','id'])
# find where A and C are equal when shifted down by 1
s=(df[['A','C']] == df[['A','C']].shift()).T.apply(lambda x: x.A and x.C)

# create a new series where we take the value of D of whe A and C are equal
# and multiply it with the next value - since it's sorted it should be next A,C match
new_d = (df.iloc[df[s].index].reset_index().D * df.iloc[df[s].index+1].reset_index().D)
new_d.index = df.iloc[df[s].index].index
new_d.name = 'results'

print(new_d)
Output >
0 80
3 35
4 24
2 16
Name: results, dtype: int64

根据上面的内容,我们只需在 df 中创建一个新列并将其分配给 new_d:

# create a new column in df and assign it to new_d
df['results'] = new_d

df.dropna()[['id','A','results']].sort_values('id')

输出:

    id  A   results
0 1 foo 80.0
2 3 foo 16.0
3 4 bar 35.0
4 5 foo 24.0

关于python - Pandas - 在多列中查找并迭代具有匹配值的行,并在另一列中乘以值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com