我有一个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 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]任何输入都非常欢迎!
发布于 2021-05-16 00:07:16
您可以创建一个独特的实验运行地图作为键和数据之和作为值。然后使用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发布于 2021-05-15 23:52:01
如果我的目标是正确的,下面的代码应该可以完成这项工作。
unique = df.drop_duplicates(subset=['experiment', 'run'], keep='first')的数据和
sums = pd.DataFrame( unique.groupby('experiment').data.sum() ).reset_index(drop=False)向原始df添加新的计算列。
df = df.merge( sums, on=['experiment'], how='inner' )发布于 2021-05-15 23:58:08
另一种解决方案,使用.pivot_table
df1 = df1.set_index("experiment")
x = df1.pivot_table(
index=pd.Grouper(level=0),
columns="run",
values="data",
aggfunc=lambda x: x.unique().sum(),
).sum(axis=1)
df1["exp-sum"] = x
print(df1.reset_index())指纹:
experiment run data exp-sum
0 A A-1 6 6.0
1 B B-1 5 10.0
2 B B-2 5 10.0
3 C C-1 4 8.0
4 C C-1 4 8.0
5 C C-2 4 8.0
6 C C-2 4 8.0https://stackoverflow.com/questions/67551953
复制相似问题