Python 在每个特定行的数据帧中获取操作结果

Python 在每个特定行的数据帧中获取操作结果,python,dataframe,Python,Dataframe,我有44行x 4列的数据。我想对每11行进行求和和和除法,但在我的函数中,我的错误是我计算了整行的和和和除法 请给我推荐一个最简单的解决方案,也许在dataframe中使用迭代 import pandas as pd data = pd.DataFrame({'A':[1,2,3,1,2,3,1,2,3,2,2,4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2], 'B':

我有44行x 4列的数据。我想对每11行进行求和和和除法,但在我的函数中,我的错误是我计算了整行的和和和除法

请给我推荐一个最简单的解决方案,也许在dataframe中使用迭代

import pandas as pd
data = pd.DataFrame({'A':[1,2,3,1,2,3,1,2,3,2,2,4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2],
                     'B':[4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,4,5,6,1,1,1,3,5,1,3,6,3,9,7,8,9,4,2,7,8,9,2],
                     'C':[7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,1,3,5,4],
                     'D':[1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3]}
                    )


a = data[['A','B','C','D']].sum()
b = data[['A','B','C','D']] / a

data_div = b.round(4)
这是我所期望的一个例子。在下图中,我对A列中的每4行进行求和和和除法


假设我正确理解了您的问题,您希望将数据帧按11行分组求和。一种方法是:

result = data.iloc[0:11].sum().sum()
sum()返回前10行的总和除以列,第二行对这些总和求和以得到总和。对于数据帧的不同片段,您可以通过放入所需片段(如data.iloc[11:23]等)来更改行选择


同样的逻辑也适用于除法

这看起来像您所期望的:

import pandas as pd
data = pd.DataFrame({'A':[1,2,3,1,2,3,1,2,3,2,2,4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2],
                 'B':[4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,4,5,6,1,1,1,3,5,1,3,6,3,9,7,8,9,4,2,7,8,9,2],
                 'C':[7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,1,3,5,4],
                 'D':[1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3]}
                )


chunk_len = 11
result = pd.DataFrame()
for i in range(4):
    res = data[i*chunk_len:(i+1)*chunk_len]/data[i*chunk_len:(i+1)*chunk_len].sum()
    if result.empty:
        result = res
    else:
        result = result.append(res)

print(result)

您可以尝试按每个
N
行分组,然后应用总和:

df.index = [i // 7  for i in range(len(df))]
df['sum_A'] = df["A"].groupby(df.index).sum()
df['div_A'] = df["A"] / df['sum_A']
完整代码:

df = pd.DataFrame({'A':[1,2,3,1,2,3,1,2,3,2,2,4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2],
                    'B':[4,5,6,4,5,6,4,5,6,1,1,1,3,5,1,3,5,1,3,5,4,1,4,5,6,1,1,1,3,5,1,3,6,3,9,7,8,9,4,2,7,8,9,2],
                    'C':[7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,1,3,5,4],
                    'D':[1,3,5,1,3,5,1,3,5,4,1,7,8,9,7,8,9,7,8,9,4,2,7,8,9,7,8,9,7,8,9,4,2,2,3,2,2,4,5,6,4,3,6,3]}
                    )

df.index = [i // 11  for i in range(len(df))]     # Define new index for groupby
df['sum_A'] = df["A"].groupby(df.index).sum()     # Apply sum per group
df['div_A'] = df["A"] / df['sum_A']               # Divide each row by the given sum
print(df)
#    A  B  C  D  sum_A     div_A
# 0  1  4  7  1     22  0.045455
# 0  2  5  8  3     22  0.090909
# 0  3  6  9  5     22  0.136364
# 0  1  4  7  1     22  0.045455
# 0  2  5  8  3     22  0.090909
# 0  3  6  9  5     22  0.136364
# 0  1  4  7  1     22  0.045455
# 0  2  5  8  3     22  0.090909
# 0  3  6  9  5     22  0.136364
# 0  2  1  4  4     22  0.090909
# 0  2  1  2  1     22  0.090909
# 1  4  1  2  7     47  0.085106
# 1  5  3  3  8     47  0.106383
# 1  6  5  2  9     47  0.127660
# 1  4  1  2  7     47  0.085106
# 1  5  3  4  8     47  0.106383
# 1  6  5  5  9     47  0.127660
# 1  4  1  6  7     47  0.085106
# 1  5  3  4  8     47  0.106383
# 1  6  5  3  9     47  0.127660
# 1  1  4  6  4     47  0.021277
# 1  1  1  3  2     47  0.021277
# 2  1  4  9  7     32  0.031250
# 2  3  5  7  8     32  0.093750
# 2  5  6  8  9     32  0.156250
# 2  1  1  9  7     32  0.031250
# 2  3  1  4  8     32  0.093750
# 2  5  1  2  9     32  0.156250
# 2  1  3  7  7     32  0.031250
# 2  3  5  8  8     32  0.093750
# 2  5  1  9  9     32  0.156250
# 2  4  3  7  4     32  0.125000
# 2  1  6  8  2     32  0.031250
# 3  7  3  9  2     78  0.089744
# 3  8  9  7  3     78  0.102564
# 3  9  7  8  2     78  0.115385
# 3  7  8  9  2     78  0.089744
# 3  8  9  4  4     78  0.102564
# 3  9  4  2  5     78  0.115385
# 3  7  2  2  6     78  0.089744
# 3  8  7  1  4     78  0.102564
# 3  9  8  3  3     78  0.115385
# 3  4  9  5  6     78  0.051282
# 3  2  2  4  3     78  0.025641

希望有帮助

你对每11行进行求和和和除法是什么意思?不是有44行吗?所以,我想对0-10,11-22,33-44范围内的和函数和除法进行运算。但是我的代码是在0-44范围内运行的谢谢,它的工作原理和我预期的一样。你能修改它使返回成为新的数据帧吗?你是说2个数据帧?原因和和div是完全不同的数据。你能描述一下结构吗?不,只是最后一个操作
(data[i*chunk\u len:(i+1)*chunk\u len]/sum\u 11)
嘿,如果数据不是44行,你的代码就无法处理,我认为范围内i的更改
(4):
通过范围内i的
变得更加动态(len(data.index)/11):
可能吗?那么对于范围内的i(len(data.index)//11)谢谢,通过修改索引数据,它会变得更容易