Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 根据其他两列中的唯一值计算dataframe中的特定和,并写入新列_Python_Pandas_Dataframe - Fatal编程技术网

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

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

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

欢迎任何意见

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

  • 获得独特的实验
  • 获取每个唯一实验的数据总和
  • 通过联接将新计算列添加到原始df

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