Python 根据其他两列中的唯一值计算dataframe中的特定和,并写入新列
我有一个3列的日期框,包括一些重复的行:Python 根据其他两列中的唯一值计算dataframe中的特定和,并写入新列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个3列的日期框,包括一些重复的行: dict1 = {'experiment': ['A', 'B', 'B', 'C', 'C', 'C', 'C'], 'run': ['A-1', 'B-1', 'B-2', 'C-1', 'C-1', 'C-2', 'C-2'], 'data': [6, 5, 5, 4, 4, 4, 4]} df1 = pd.DataFrame(data=dict1) print(df1) experiment run data 0 A
dict1 = {'experiment': ['A', 'B', 'B', 'C', 'C', 'C', 'C'], 'run': ['A-1', 'B-1', 'B-2', 'C-1', 'C-1', 'C-2', 'C-2'], 'data': [6, 5, 5, 4, 4, 4, 4]}
df1 = pd.DataFrame(data=dict1)
print(df1)
experiment run data
0 A A-1 6
1 B B-1 5
2 B B-2 5
3 C C-1 4
4 C C-1 4
5 C C-2 4
6 C C-2 4
我正在尝试创建一个新列,对于每一行,该列包含该实验唯一运行的列“数据”的总和。重复的行应该保持不变。因此,我的预期结果是:
experiment run data exp-sum
0 A A-1 6 6
1 B B-1 5 10
2 B B-2 5 10
3 C C-1 4 8
4 C C-1 4 8
5 C C-2 4 8
6 C C-2 4 8
我曾尝试将.groupby和.unique组合起来,但到目前为止,我每次运行只得到正确的总和,这需要进一步汇总(每次实验),然后写入原始df
print(df1.groupby('run')['data'].unique())
run
A-1 [6]
B-1 [5]
B-2 [5]
C-1 [4]
C-2 [4]
欢迎任何意见 如果我的目标正确,下面的代码应该可以完成这项工作
另一种解决方案是使用
.pivot\u table
:
df1=df1.设置索引(“实验”)
x=df1.pivot\u表(
指数=pd.石斑鱼(等级=0),
columns=“run”,
values=“data”,
aggfunc=lambda x:x.unique().sum(),
).sum(轴=1)
df1[“exp sum”]=x
打印(df1.reset_index())
印刷品:
实验运行数据exp sum
0A-166.0
1 B-1 5 10.0
2 B-2 5 10.0
3C-148.0
4 C-1 4 8.0
5 C-2 4 8.0
6 C-2 4 8.0
您可以创建一个独特的实验运行图作为键,数据总和作为值。然后使用Series.map
将值映射到实验
mapper = df1.drop_duplicates('run').groupby('experiment')['data'].sum()
print(mapper)
experiment
A 6
B 10
C 8
df1['exp-sum'] = df1['experiment'].map(mapper)
print(df1)
experiment run data exp-sum
0 A A-1 6 6
1 B B-1 5 10
2 B B-2 5 10
3 C C-1 4 8
4 C C-1 4 8
5 C C-2 4 8
6 C C-2 4 8
为什么运行
B-2
的exp sum
是10
而不是5
?实验B有两个独特的运行,即B-1和B-2。所有行的exp sum应该是该实验中唯一运行的数据之和。因此,对于实验B的每一行,这里是5+5(来自B-1和B-2)。如果第4行中的数据是5
,而不是4
,那么结果应该是什么?如果第4行中的数据是5,那么第3行中的数据也必须是5,因为行是重复的,并且相同的“exp”和“run”始终具有相同的数据。实验C的exp-sum结果应该是9。这很有效,看起来很直观,谢谢!这很有效,谢谢!
sums = pd.DataFrame( unique.groupby('experiment').data.sum() ).reset_index(drop=False)
df = df.merge( sums, on=['experiment'], how='inner' )
mapper = df1.drop_duplicates('run').groupby('experiment')['data'].sum()
print(mapper)
experiment
A 6
B 10
C 8
df1['exp-sum'] = df1['experiment'].map(mapper)
print(df1)
experiment run data exp-sum
0 A A-1 6 6
1 B B-1 5 10
2 B B-2 5 10
3 C C-1 4 8
4 C C-1 4 8
5 C C-2 4 8
6 C C-2 4 8