【问题标题】:python 2.7 script to add a columnpython 2.7脚本添加一列
【发布时间】:2017-05-25 03:20:03
【问题描述】:

我有一个这种格式的输入文件,有 5 列

输入文件:1.csv

INK137377383,3,2613,1513,899
INK133344444,3,106029,106961,12981 
INK112233343,2,1775,NA,NA 
INK22233333,3,1252,767,758
INK1223824,1,NA,NA,NA

我正在考虑的条件是

如果输入文件中第 2 列的值为 3 并且如果 col4,5 和 6 值小于或等于 3000 那么它应该追加 3_category到输出

如果输入文件中第 2 列的值为 3 并且如果 col4,5 和 6 值在 10000 和 15000 之间,那么它应该附加 3_1category 到输出

如果输入文件中第 2 列的值为 2 并且如果 col4,5 和 6 值小于或等于 3000 那么它应该追加 2_category 到输出

如果输入文件中第 2 列的值为 2 并且如果 col4,5 和 6 值在 10000 和 15000 之间,那么它应该附加 2_1category 到输出

如果输入文件中第 2 列的值为 1,那么它应该追加 1_category 到输出

预期输出:

INK137377383,3,2613,1513,899,3_category
INK133344444,3,106029,106961,12981,3_1category   
INK112233343,2,1775,NA,NA,2_category
INK22233333,3,1252,767,758,3_category
INK1223824,1,NA,NA,NA,1_category

这是我在 python 2.7 上尝试过但无法获得预期输出的脚本

import csv


with open('1.csv') as k1, open('out.csv', 'w') as k2:
    reader = csv.reader(k1)
    writer = csv.writer(k2)

    headers = next(reader)
    headers.append('new_column')
    writer.writerow(headers)

    for row in reader:
        new_value = compute_from_row(row)
        row.append(new_value)
        writer.writerow(row)

【问题讨论】:

  • 考虑使用熊猫
  • 实际输出与预期输出究竟有何不同?你的方法对我来说似乎很明智。你确定compute_from_row 函数工作正常吗?
  • 猜猜看:每个有效行之间有空行吗?
  • 样本输出有什么问题?
  • 短语“不起作用”是无用

标签: python python-2.7


【解决方案1】:

鉴于您提出的问题没有足够的信息,我已经制定了一个实施您所写规则的答案。不幸的是,这很难验证,因为您提供的预期输出不符合规则(例如 133344444,3,106029,106961,12981,3_1category)。我还假设如果找到 NA 值,则应将其视为零整数值。

def compute_from_row(row):
    # Replace NA with value of 0
    row = ['0' if 'NA' in x else x for x in row]
    # Convert to integers ignoring the first column
    row[1:] = map(int, row[1:])
    numbers = row[2:5]
    # Implement the rules
    if row[1] == 3 and all(map(lambda x: x<=3000, numbers)):
      return '3_category'
    elif row[1] == 3 and all(map(lambda x: x<15000 and x>10000, numbers)):
      return '3_1category'
    elif row[1] == 2 and all(map(lambda x: x<=3000, numbers)):
      return '2_category'
    elif row[1] == 2 and all(map(lambda x: x<15000 and x>10000, numbers)):
      return '2_1category'
    elif row[1] == 1:
      return '1_category'



import csv


with open('1.csv') as k1, open('out.csv', 'w') as k2:
    reader = csv.reader(k1)
    writer = csv.writer(k2)

    headers = next(reader)
    headers.append('new_column')
    writer.writerow(headers)

    for row in reader:
        new_value = compute_from_row(row)
        row.append(new_value)
        writer.writerow(row)

【讨论】:

  • 我可以说您没有我在 2.py 中创建的函数,因为您在第 13 行调用了 compute_from_row(row)。如果您按照我编写的代码复制并运行它,它应该运行或至少为您提供一些新信息。到目前为止,您似乎甚至没有使用我提供的代码。
  • 对,在您的测试输入中,您没有任何包含混合字母和数字字符的值。自然,您会想要处理这种情况。我相信,如果您提供了您正在使用的实际输入数据以及您期望和获得的实际输出数据,而不是为了 SO 消费而精简它,那么现在您拥有一些代码,社区会更适合帮助您。您的问题是关于特定错误的,因此我们需要特定的输入和输出,以便从此时起提供任何有用的反馈。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多