【问题标题】:summing the values row wise逐行求和
【发布时间】:2021-09-08 04:17:42
【问题描述】:

我有如下排列的三列数据:

输入文件:

>>>>>
1.0 2.0 3.0
2.0 2.0 4.0
3.0 4.5 8.0
>>>>>
1.0 2.5 6.8
2.0 3.5 6.8
3.0 1.2 1.9
>>>>>
1.0 1.2 1.3
2.0 2.7 1.8
3.0 4.5 8.5

在上面的输入文件中,第一列的值是重复的,所以我只想取一次那个值,并且想逐行求和第三列的值,不想取任何第二列的值。

我还想附加固定值 1.0 的第三列

最后想将结果保存在另一个名为 output.txt 的测试文件中。

输出:

1.0  11.1  1.0
2.0  12.6  1.0
3.0  18.4  1.0

在输出第二列中的值来自

3.0+6.8+1.3
4.0+6.8+1.8
8.0+1.9+8.5

我尝试使用 numpy 但出现错误

  import numpy as np
  import pandas as pd
  import glob
  data=np.loadtxt("input.txt")

【问题讨论】:

  • 这看起来像一个 groupby :df.groupby(0)[2].sum()
  • 是单个输入数据框还是三个都不同?
  • 这是单个输入数据框

标签: python pandas numpy glob


【解决方案1】:

您需要使用pandas.read_csv 读取您的输入文件,您需要将分隔符设置为" ",不指定标题并将">" 作为注释行。

然后执行groupby/sum操作,使用pandas.to_csv导出不带header

import pandas as pd

# input
df = pd.read_csv('filename.csv', delimiter=' ', header=None, comment='>')

# output
(df.groupby(0)[[2]].sum()
   .assign(col=1.0)
   .to_csv('output.txt', header=False, sep=' ', float_format='%.2f')
)

输出.txt:

1.00 11.10 1.00
2.00 12.60 1.00
3.00 18.40 1.00

【讨论】:

  • 输出很好,还有一个小查询,我只想通过重复一个数字向 output.txt 添加额外的列,并将其附加到输出的第三列。
  • 所以输出应该是 1.00 11.10 1.0 2.00 12.60 1.0 3.00 18.40 1.0
【解决方案2】:

试试:

df[2].groupby(np.arange(len(df)) % 3).sum()
# or df.iloc[:, 2].groupby(np.arange(len(df)) % 3).sum()

0    11.1
1    12.6
2    18.4
Name: 2, dtype: float64

【讨论】:

    【解决方案3】:

    groupbyreset index 一起使用

    dfNew = df.groupby(0)[2].sum().reset_index()
    dfNew.to_csv('output.txt', index= False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2018-08-13
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多