【问题标题】:Multiply certain columns in csv files将 csv 文件中的某些列相乘
【发布时间】:2019-08-12 06:23:46
【问题描述】:

我有多个大型 csv 文件,其中某些列在我的情况下 0 是第一个:

1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49

应该乘以-1。

我想翻转这些列的数字符号并将所有 + 变为 - ,反之亦然。然后应保存该文件。这可以在linux中使用shell脚本吗?也许使用 awk 或 pandas 或类似的东西?

简短示例:

-2,-4,-5, 8, 5, 7

应该是

2, 4 ,5, -8,-5,-7

编辑:到目前为止我的努力是

import pandas as pd

myfile = open("anyfile.csv")
df = pd.read_csv(myfile, header=None)

#print(df, end="\n\n")

df[1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49] *= -1

#print(df)

如何将该结果保存到新的 csv。是否可以通过 shellscript 自动执行此操作?

【问题讨论】:

  • 因此,我们鼓励所有用户发布他们为解决自己的问题所做的努力,所以请这样做并让我们知道。
  • 试试这样的:awk -F "," '{print $1*-1","$2*-1}' file.csv
  • 要保存熊猫df,您可以使用:df.to_csv('outputfile.csv')

标签: pandas shell csv awk


【解决方案1】:

请您尝试以下操作。我正在考虑您要更改所有列的符号,并且您希望以逗号分隔符格式输出。

awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++){$i=$i*-1}} 1'  Input_file

或者(根据詹姆斯先生的好建议):

awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++){$i=-$i}}} 1'  Input_file

【讨论】:

    【解决方案2】:

    使用 awk:

    columns="1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49"
    
    awk -v f="$columns" '
        BEGIN{ FS=OFS=","; n=split(f,cols,",") }
        { for(i=1; i<=n; i++) $(cols[i]+1)=-1*$(cols[i]+1) }1
    ' file.csv 
    

    地点:

    • 列号列表在awk中被指定为变量f,然后拆分成一个名为cols的数组
    • 然后您可以循环遍历这个数组并通过$(cols[i]+1) 找到列号,然后进行数学运算。

    我假设所有列都是数字,并且字段中没有嵌入 ,

    【讨论】:

    • for(i=1; i&lt;=n; i++) $(cols[i]+1)=-1*$(cols[i]+1) = for (i in cols) $(cols[i]+1)*=-1
    【解决方案3】:

    始终添加- 并删除--。处理空格。

    echo "-2,-4,-5, 8, 5, 7" | sed -r 's/ //g;s/(^|,)/& -/g;s/--//g;s/^ //'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2018-10-13
      • 2020-07-10
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多