【问题标题】:Calculate specific sums in dataframe, based on unique values in two other columns, and write to new column根据其他两列中的唯一值计算数据框中的特定总和,并写入新列
【发布时间】:2021-05-16 08:07:16
【问题描述】:

我有一个包含 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]

非常欢迎任何意见!

【问题讨论】:

  • 为什么运行 B-2exp-sum10 而不是 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。

标签: python pandas dataframe


【解决方案1】:

您可以创建一个独特的实验运行图作为键和数据的总和作为值。然后使用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

【讨论】:

  • 这很有效,而且看起来很直观,谢谢!
【解决方案2】:

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

  1. 获得独特的实验
unique = df.drop_duplicates(subset=['experiment', 'run'], keep='first')
  1. 获取每个唯一实验的数据总和
sums = pd.DataFrame( unique.groupby('experiment').data.sum() ).reset_index(drop=False)
  1. 通过连接将新计算列添加到原始 df
df = df.merge( sums, on=['experiment'], how='inner' )

【讨论】:

    【解决方案3】:

    另一种解决方案,使用.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.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多