首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据其他两列中的唯一值,在dataframe中计算特定和,并写入新列。

根据其他两列中的唯一值,在dataframe中计算特定和,并写入新列。
EN

Stack Overflow用户
提问于 2021-05-15 23:12:34
回答 3查看 341关注 0票数 2

我有一个3列的日期框架,包括一些重复的行:

代码语言:javascript
复制
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

我试图为每一行创建一个新列,该列包含该实验唯一运行的列‘数据’的总和。重复的行应该保持原样。所以我的预期结果是:

代码语言:javascript
复制
  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。

代码语言:javascript
复制
print(df1.groupby('run')['data'].unique())

run
A-1    [6]
B-1    [5]
B-2    [5]
C-1    [4]
C-2    [4]

任何输入都非常欢迎!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-16 00:07:16

您可以创建一个独特的实验运行地图作为键和数据之和作为值。然后使用Series.map映射要实验的值,

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-05-15 23:52:01

如果我的目标是正确的,下面的代码应该可以完成这项工作。

  1. 获得独一无二的实验

代码语言:javascript
复制
unique = df.drop_duplicates(subset=['experiment', 'run'], keep='first')

  1. 得到每个唯一实验

的数据和

代码语言:javascript
复制
sums = pd.DataFrame( unique.groupby('experiment').data.sum() ).reset_index(drop=False)

  1. 通过联接

向原始df添加新的计算列。

代码语言:javascript
复制
df = df.merge( sums, on=['experiment'], how='inner' )
票数 0
EN

Stack Overflow用户

发布于 2021-05-15 23:58:08

另一种解决方案,使用.pivot_table

代码语言:javascript
复制
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())

指纹:

代码语言:javascript
复制
  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.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67551953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档