【问题标题】:Pandas: Dataframe Calculation - New Rows with Division, New Columns with Sums and AveragesPandas:数据框计算 - 带除法的新行,带总和和平均值的新列
【发布时间】:2023-03-28 09:10:01
【问题描述】:

所以我得到了一个看起来像这样的 Pandas DataFrame:

import pandas as pd

df1 = pd.DataFrame([[5618, 5863, 8873, 7903, 9477, 7177, 7648, 9592],
                    [5698, 6009, 8242, 7356, 6191, 8817, 7340, 11781],
                    [5721, 6858, 8401, 6826, 6910, 6243, 6814, 9704]], 
                    columns=["Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan", "Feb"])

Output:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
0   5618    5863    8873    7903    9477    7177    7648    9592
1   5698    6009    8242    7356    6191    8817    7340    11781
2   5721    6858    8401    6826    6910    6243    6814    9704

首先我想插入 2 个索引为 3 和 4 的新行: 在第一个中,我想将第 1 行的值除以第 0 行的值:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
3   101,42  102,49  92,88   93,07   65,32   122,8   95,97   122,82

在第二个中,我想将第 1 行的值除以第 2 行的值:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
4   99,59   87,62   98,10   107,76  89,59   141,23  107,71  121,40

在下一步中,我想创建一个新列,其中包含当月原始值的总和以及新创建的行的平均值。

df1["Sum_Avg"] = df1.sum(axis=1)
    
Output:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb     Sum_Avg
0   5618    5863    8873    7903    9477    7177    7648    9592    62151
1   5698    6009    8242    7356    6191    8817    7340    11781   61434
2   5721    6858    8401    6826    6910    6243    6814    9704    57477

我不知道如何创建索引为 3 和 4 的行,所以我什至不知道如何将平均值与总和放在同一行。

最后,整个表格应如下所示: Img

到目前为止我尝试了什么:

使用第 0 行创建一个新的 DataFrame:

df2 = pd.DataFrame(df1.iloc[[0]])
df2

Output:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
0   5618    5863    8873    7903    9477    7177    7648    9592

使用第 1 行创建一个新的 DataFrame:

df3 = pd.DataFrame(df1.iloc[[1]])
df3

Output:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
1   5698    6009    8242    7356    6191    8817    7340    11781

用df2和df3的划分制作一个新的DataFrame:

df4 = df3/df2
df4

Output:

    Jul     Aug     Sep     Oct     Nov     Dec     Jan     Feb
0   NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
1   NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN

这里的事情搞砸了,这就是我创建这篇文章的原因。

【问题讨论】:

  • 请注意,您的示例与您所描述的有所不同。 In the second one i want to divide the values of row 1 by the values of row 2: 似乎实际上是 row2/row1

标签: python pandas calculation


【解决方案1】:

DataFrame.divDataFrame.shift 移位的值一起使用,通过索引仅删除NaN 行并通过concat 添加到原始行:

df1["Sum_Avg"] = df1.sum(axis=1)
df = pd.concat([df1, df1.div(df1.shift()).iloc[1:]], ignore_index=True)
print (df)
           Jul          Aug          Sep          Oct          Nov  \
0  5618.000000  5863.000000  8873.000000  7903.000000  9477.000000   
1  5698.000000  6009.000000  8242.000000  7356.000000  6191.000000   
2  5721.000000  6858.000000  8401.000000  6826.000000  6910.000000   
3     1.014240     1.024902     0.928885     0.930786     0.653266   
4     1.004037     1.141288     1.019291     0.927950     1.116136   

           Dec          Jan           Feb       Sum_Avg  
0  7177.000000  7648.000000   9592.000000  62151.000000  
1  8817.000000  7340.000000  11781.000000  61434.000000  
2  6243.000000  6814.000000   9704.000000  57477.000000  
3     1.228508     0.959728      1.228211      0.988464  
4     0.708064     0.928338      0.823699      0.935589  

通过输出数据解决:

df1["Sum_Avg"] = df1.sum(axis=1)
df = pd.concat([df1, df1.iloc[1].div(df1.iloc[[0,2]]) ], ignore_index=True)


print (df)
          Jul          Aug          Sep          Oct          Nov  \
0  5618.00000  5863.000000  8873.000000  7903.000000  9477.000000   
1  5698.00000  6009.000000  8242.000000  7356.000000  6191.000000   
2  5721.00000  6858.000000  8401.000000  6826.000000  6910.000000   
3     1.01424     1.024902     0.928885     0.930786     0.653266   
4     0.99598     0.876203     0.981074     1.077644     0.895948   

           Dec          Jan           Feb       Sum_Avg  
0  7177.000000  7648.000000   9592.000000  62151.000000  
1  8817.000000  7340.000000  11781.000000  61434.000000  
2  6243.000000  6814.000000   9704.000000  57477.000000  
3     1.228508     0.959728      1.228211      0.988464  
4     1.412302     1.077194      1.214035      1.068845  

【讨论】:

    【解决方案2】:

    你可以试试这个:

    df = df1.T
    
    df[3] = df[1] / df[0]
    df[4] = df[1] / df[2]
    
    df1 = df.T
    df1["Sum_Avg"] = df1.sum(axis=1)
    
    #           Jul          Aug  ...           Feb       Sum_Avg
    # 0  5618.00000  5863.000000  ...   9592.000000  62151.000000
    # 1  5698.00000  6009.000000  ...  11781.000000  61434.000000
    # 2  5721.00000  6858.000000  ...   9704.000000  57477.000000
    # 3     1.01424     1.024902  ...      1.228211      7.968526
    # 4     0.99598     0.876203  ...      1.214035      8.530380
    # [5 rows x 9 columns]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多