Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 熊猫:如何创建列,其中根据其他列值的条件求和其他列的总和?_Python_Pandas_Sum_Data Analysis - Fatal编程技术网

Python 熊猫:如何创建列,其中根据其他列值的条件求和其他列的总和?

Python 熊猫:如何创建列,其中根据其他列值的条件求和其他列的总和?,python,pandas,sum,data-analysis,Python,Pandas,Sum,Data Analysis,我有以下数据框 import pandas as pd df = pd.read_csv('filename.csv') print(df) code1 code2 code3 code4 value1 value2 value3 value4 0 101 101 101 101 1000 1000 1000 1000 1 101 101 101 201 1000 1000 1000 1000 2 101 10

我有以下数据框

import pandas as pd
df = pd.read_csv('filename.csv')

print(df)

 code1  code2 code3 code4 value1 value2 value3 value4 
0 101   101   101   101   1000    1000  1000   1000    
1 101   101   101   201   1000    1000  1000   1000    
2 101   101   201   201   1000    1000  1000   1000    
3 101   201   201   201   1000    1000  1000   1000    
4 101   201   201   301   1000    1000  1000   1000    
5 101   201   301   301   1000    1000  1000   1000    
6 101   301   301   301   1000    1000  1000   1000    
7 101   101   101   301   1000    1000  1000   1000    
8 101   201   301   0     1000    1000  1000   0       
9 101   301   0     0     1000    1000  0      0       


....
我需要创建一列来求列值(value1、value2、value3、value4)的和,考虑到列代码(code1、code2、code3、code4),如下所示:

  code1 code2 code3 code4 value1 value2 value3 value4 sum_code_101 sum_code_201 sum_code_301
0 101   101   101   101   1000    1000  1000   1000     4000           0           0
1 101   101   101   201   1000    1000  1000   1000     3000           1000        0
2 101   101   201   201   1000    1000  1000   1000     2000           2000        0
3 101   201   201   201   1000    1000  1000   1000     1000           3000        0
4 101   201   201   301   1000    1000  1000   1000     1000           2000        1000
5 101   201   301   301   1000    1000  1000   1000     1000           1000        2000
6 101   301   301   301   1000    1000  1000   1000     1000           0           3000
7 101   101   101   301   1000    1000  1000   1000     3000           0           1000
8 101   201   301   0     1000    1000  1000   0        1000           1000        1000
9 101   301   0     0     1000    1000  0      0        1000           0           1000  
我试过:

df['sum_code_101']=df[df['code1']=='101'],['value1']+df[df['code2']=='101'],['value2']+df[df['code3']=='101'],['value3']+df[df['code4']=='101'],['value4']
df['sum_code_201']=df[df['code1']=='201'],['value1']+df[df['code2']=='201'],['value2']+df[df['code3']=='201'],['value3']+df[df['code4']=='201'],['value4']
df['sum_code_301']=df[df['code1']=='301'],['value1']+df[df['code2']=='301'],['value2']+df[df['code3']=='301'],['value3']+df[df['code4']=='301'],['value4']
但是,我收到了以下错误消息:

TypeError: 'Series' objects are mutable, thus they cannot be hashed
由于实际数据帧有25个不同的代码(101、201、301…),我需要创建25个列来求和它们的值


非常感谢你们的帮助,谢谢

您可以结合使用
pd.wide\u to_long
groupby
以及一些数据帧重塑

df = df.reset_index()
df_long = pd.wide_to_long(df, ['code','value'], 'index', 'No')
df_long.groupby(['index','code']).sum().unstack(fill_value=0)
df_sum = df_long.groupby(['index','code']).sum().replace(0, np.nan).dropna(axis=0)['value'].unstack(fill_value=0)
df_sum.columns = [f'sum_{df_sum.columns.name}_{i}' for i in df_sum.columns]
df_out = df.set_index('index').join(df_sum)
df_out
输出:

       code1  code2  code3  code4  value1  value2  value3  value4  sum_code_101  sum_code_201  sum_code_301
index                                                                                                      
0        101    101    101    101    1000    1000    1000    1000        4000.0           0.0           0.0
1        101    101    101    201    1000    1000    1000    1000        3000.0        1000.0           0.0
2        101    101    201    201    1000    1000    1000    1000        2000.0        2000.0           0.0
3        101    201    201    201    1000    1000    1000    1000        1000.0        3000.0           0.0
4        101    201    201    301    1000    1000    1000    1000        1000.0        2000.0        1000.0
5        101    201    301    301    1000    1000    1000    1000        1000.0        1000.0        2000.0
6        101    301    301    301    1000    1000    1000    1000        1000.0           0.0        3000.0
7        101    101    101    301    1000    1000    1000    1000        3000.0           0.0        1000.0
8        101    201    301      0    1000    1000    1000       0        1000.0        1000.0        1000.0
9        101    301      0      0    1000    1000       0       0        1000.0           0.0        1000.0

下面是一个使用pandas apply方法的解决方案。通常,当您可以使用列/行操作时,情况并不理想。但这是可行的

import pandas as pd
data = {
    'code1': ['101', '101', '101', '101', '101', '101'],
    'code2': ['101', '101', '101', '201', '201', '201'],
    'code3': ['101', '101', '101', '201', '201', '301'],
    'code4': ['101', '201', '201', '201', '301', '301'],
    'value1': [1000, 1000, 1000, 1000, 1000, 1000],
    'value2': [1000, 1000, 1000, 1000, 1000, 1000],
    'value3': [1000, 1000, 1000, 1000, 1000, 1000],
    'value4': [1000, 1000, 1000, 1000, 1000, 1000]
}
df = pd.DataFrame(data)

def apply_to_row(row, value):
    code_cols = ['code1', 'code2', 'code3', 'code4']
    value_cols = ['value1', 'value2', 'value3', 'value4']

    code_value_sum = 0
    for code_col, value_col in zip(code_cols, value_cols):
        if row[code_col] == value:
            code_value_sum += row[value_col]

    return code_value_sum

code_values = ['101', '201', '301'] # probably replace with a distinct value list of code columns
for code_value in code_values:
    df['sum_code_' + str(code_value)] = df.apply(apply_to_row, value=code_value, axis=1)
结果如下:

  code1 code2 code3 code4  value1  value2  value3  value4   sum_code_101  sum_code_201  sum_code_301  
0   101   101   101   101    1000    1000    1000    1000          4000     0                0  
1   101   101   101   201    1000    1000    1000    1000          3000     1000             0  
2   101   101   101   201    1000    1000    1000    1000          3000     1000             0  
3   101   201   201   201    1000    1000    1000    1000          1000     3000             0  
4   101   201   201   301    1000    1000    1000    1000          1000     2000             1000  
5   101   201   301   301    1000    1000    1000    1000          1000     1000             2000
谢谢