pandas dataframe将值添加到组的一个成员

时间:2018-01-29 19:00:56

标签: python pandas dataframe pandas-groupby

我们有以下具有3列的数据框(volumeMount)。目标是确保基于ID 的每个组的“加载”总和等于1.我认为我们可以使用df

执行此操作

groupby

如果一个组的总负载小于1,我们想要从该组中加或减(通过加上或减去所有(按比例)或该组的一个成员的负载)使总和等于1而不添加数据帧的额外行(只需修改值)。

任何帮助,特别是在问题的第二部分,我们非常感谢。 提前谢谢大家。

2 个答案:

答案 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