gpt4 book ai didi

python - 检查元素是否是邻居,然后创建一个新列

转载 作者:行者123 更新时间:2023-12-05 03:28:57 25 4
gpt4 key购买 nike

我有一个数据框,它由五列“ID”、“Name”、“pos_x”、“pos_y”和“Volume”组成,如下所示:

ID | Name | pos_x | pos_y | volume
1 | A | 1 | 1.5 | 10
2 | A | 3.5 | 3 | 6
3 | A | 4 | 4 | 8
4 | A | 4.5 | 4.5 | 9
5 | A | 5 | 6 | 10
1 | B | 1.2 | 1.2 | 4
3 | B | 4.3 | 4.4 | 8
4 | B | 4.5 | 4.2 | 7
2 | C | 3 | 3.3 | 9
3 | C | 4.2 | 4.1 | 10

我现在想在数据框(“volume_avg”)中创建一个新列,其中计算所有 ID 的平均体积,其位于相应 ID 的 2.5 毫米半径范围内。

我的想法是首先遍历每个名​​称的每个 ID(因为名称 + ID 是主键),然后查看每个 ID 的位置 x 和 y。使用 if 循环,然后我将检查 ID 是否是邻居。

所以条件是:

如果 pos_x(当前 ID)< pos_x(所有其他 ID)- 2.5 或 > pos_x(所有其他 ID)+ 2.5

else if pos_y(当前 ID)< pos_y(所有其他 ID)- 2.5 或 > pos_y(所有其他 ID)+ 2.5

然后计算 sum(volume)/count(ID's)

除此之外什么都没有

不幸的是,我不知道如何在 python 代码中编写这些注意事项....如果你能帮助我,我会很高兴。非常感谢。

大卫

最佳答案

我将 if 和 else 部分中的条件解释为 (x,y) 坐标上的矩形限制。如果这不正确,请告诉我,我可以调整 if/else 中的逻辑。

import pandas as pd

# create the structure of example dataframe
df = pd.DataFrame([[1, 'A', 1, 1.5, 10],
[2, 'A', 3.5, 3, 6],
[3, 'A', 4, 4, 8],
[4, 'A', 4.5, 4.5, 9],
[5 ,'A' , 5 , 6 , 10],
[1 ,'B' , 1.2 , 1.2 , 4],
[3 ,'B' , 4.3 , 4.4 , 8],
[4 ,'B' , 4.5 , 4.2 , 7],
[2 ,'C' , 3 , 3.3 , 9],
[3 ,'C' , 4.2 , 4.1 , 10],
],
columns=['ID', 'Name', 'pos_x', 'pos_y', 'volume'])

# create volume average with rows that meet criterion
volume_avgs = []
for g, grouper in df.groupby('Name'):
for base_row in grouper.iterrows():
v_sum = 0
v_count = 0
for row in grouper.iterrows():
if row[1].ID == base_row[1].ID: # skip the item itself
continue
elif abs(row[1].pos_x - base_row[1].pos_x) < 2.5 or abs(row[1].pos_y - base_row[1].pos_y) < 2.5:
v_sum += row[1].volume
v_count += 1
volume_avgs.append([base_row[1].ID, g, v_sum / v_count if v_count > 0 else 0, v_count])

df_vol_avgs = pd.DataFrame(volume_avgs, columns=['ID', 'Name', 'volume_avg', 'volume_count'])

merged_df = df.merge(df_vol_avgs, on=['ID', 'Name'])
merged_df

请注意,如果实际数据很大,这可能无法很好地扩展。由于双 for 循环,特别是对于具有大量数据的组。此外,如果您想要 NoneNan 如果要平均的附近点总数为 0,您可以更改 if/else from

v_sum / v_count if v_count > 0 else 0

v_sum / v_count if v_count > 0 else None

对于 None 的情况和 Nan 的情况类似,假设使用 numpy.nan

关于python - 检查元素是否是邻居,然后创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71125436/

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