我们有以下具有3列的数据框(volumeMount
)。目标是确保基于ID 的每个组的“加载”总和等于1.我认为我们可以使用df
groupby
如果一个组的总负载小于1,我们想要从该组中加或减(通过加上或减去所有(按比例)或该组的一个成员的负载)使总和等于1而不添加数据帧的额外行(只需修改值)。
任何帮助,特别是在问题的第二部分,我们非常感谢。 提前谢谢大家。
答案 0 :(得分:1)
import pandas as pd
data = [
['AEC', 0.2093275],
['AEC', 0.5384086],
['CIZ', 0.1465657],
['CIZ', 0.7465657],
['CIZ', 0.1465657],
]
df = pd.DataFrame(data, columns = ['ID', 'Load'])
groups = df.groupby('ID').agg({'ID': 'count', 'Load': 'sum'})
groups = groups.rename(columns = {'ID': 'Count', 'Load': 'Total'}).reset_index()
groups['adjust'] = (1 - groups['Total'])/groups['Count']
df = pd.merge(df, groups, on = 'ID')
df['Load'] = df['Load'] + df['adjust']
df = df.drop(['Total', 'Count', 'adjust'], axis = 1)
print(df)
#output
ID Load
0 AEC 0.335459
1 AEC 0.664541
2 CIZ 0.133333
3 CIZ 0.733333
4 CIZ 0.133333
根据评论更新代码。根据汇总的数据框计算调整字段。然后适用于每组的均匀调整。
答案 1 :(得分:1)
这是一个解决方案:
import pandas as pd
df = pd.DataFrame([[1, 'AEC', 0.2093275], [2, 'AEC', 0.5384086],
[3, 'CIZ', 0.1465657], [4, 'CIZ', 0.7465657],
[5, 'CIZ', 0.1465657]], columns=['Num', 'ID', 'Load'])
df_grouped = df.groupby('ID').Load.agg(['count', 'sum']).reset_index()
df_grouped['change'] = (1 - df_grouped['sum']) / df_grouped['count']
change_map = df_grouped.set_index('ID')['change'].to_dict()
df.Load = df.Load + df.ID.map(change_map)
# df
# Num ID Load
# 0 1 AEC 0.335459
# 1 2 AEC 0.664541
# 2 3 CIZ 0.133333
# 3 4 CIZ 0.733333
# 4 5 CIZ 0.133333