Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向组的一个成员添加值的数据帧_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 向组的一个成员添加值的数据帧

Python 向组的一个成员添加值的数据帧,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我们有以下数据帧(df),它有3列。目标是确保基于IDs的每个组的“负载”总和等于1。我想我们可以使用groupby Num ID加载 1 AEC 0.2093275 2 AEC 0.5384086 3 CIZ 0.1465657 4 CIZ 0.7465657 5 CIZ 0.1465657 如果一个组的总负载小于1,我们希望在不向数据帧添加额外行的情况下(仅通过修改值),从组中添加或减去(通过添加或减去所有(按比例)或组中一个成员的负载),使总和等于1 非常感谢您的帮助,特别是在问题的第二

我们有以下数据帧(
df
),它有3列。目标是确保基于IDs的每个组的“负载”总和等于1。我想我们可以使用
groupby

Num ID加载
1 AEC 0.2093275
2 AEC 0.5384086
3 CIZ 0.1465657
4 CIZ 0.7465657
5 CIZ 0.1465657

如果一个组的总负载小于1,我们希望在不向数据帧添加额外行的情况下(仅通过修改值),从组中添加或减去(通过添加或减去所有(按比例)或组中一个成员的负载),使总和等于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
根据注释更新代码。根据汇总数据框计算调整字段。然后对每组均匀地进行调整。

以下是一种解决方案:

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

谢谢这对我不起作用,因为您实际上是在向数据帧添加一行。我想给组中的一个载荷减去或加上一个值,使组总数等于1。你会怎么做?提前非常感谢:)是否可以只添加到每个组中的一个元素,而不是添加/减去每个组中的所有成员?@Ali,当然有可能-请随意提出一个新问题。@jp_data_analysis我在这里添加了一个问题:是否可以只添加到每个组中的一个元素,而不是添加/减去每个组中的所有成员?@Ali,出于兴趣,你为什么不接受这个答案?