如何使用从 python 中的 DataFrame 生成的结果写入 csv?

Posted

技术标签:

【中文标题】如何使用从 python 中的 DataFrame 生成的结果写入 csv?【英文标题】:How to write into csv using the results generated from a DataFrame in python? 【发布时间】:2017-04-13 07:08:29 【问题描述】:

我正在使用 Python 中 Pandas 模块中的 DataFrame 从 tsv 文件中读取数据。

df = pandas.DataFrame.from_csv(filename, sep='\t')

该文件有大约 5000 列(4999 个测试参数和 1 个结果/输出值)。

我遍历整个 tsv 文件并检查结果值是否与预期值匹配。然后我将这一行写入另一个 csv 文件中。

expected_value = 'some_value'
with open(file_to_write, 'w') as csvfile:
  csvfwriter = csv.writer(csvfile, delimiter='\t')
  for row in df.iterrows():
    result = row['RESULT']
    if expected_value.lower() in str(result).lower():
        csvwriter.writerow(row)

但在输出 csv 文件中,结果不正确,即各个列值没有进入它们各自的列/单元格。它被附加为行。如何在 csv 文件中正确写入这些数据?

建议的答案效果很好,但是我需要检查多个条件。我有一个包含一些值的列表:

vals = ['hello', 'foo', 'bar'] 所有行的一列具有类似于“hello,foo,bar”的值。我需要做两项检查,一项是 vals 列表中的任何值是否存在于值为 'hello, foo, bar' 的列中,或者结果值是否与预期值匹配。我写了以下代码

df = pd.DataFrame.from_csv(filename, sep='\t')
for index, row in df.iterrows():
  csv_vals = row['COL']
  values = str(csv_vals).split(",")
  if(len(set(vals).intersection(set(values))) > 0 or expected_value.lower() in str(row['RESULT_COL'].lower()):
    print row['RESULT_COL']

【问题讨论】:

首先,我不会尝试使用它们的字符串表示来比较数字......如果你有更多或更少的小数位等,它将不起作用。将它们转换为浮动并检查是否相等。其次,你不能只在pandas中进行修改,然后使用df.to_csv(file_to_write)输出一个完整的csv文件吗? 如何在pandas中进行修改?此外,是否可以使用我感兴趣的行创建一个单独的数据框? 【参考方案1】:

您可以像这样过滤值:

df[df['RESULT'].str.lower().str.contains(expected_value.lower())].to_csv(filename)

这将适用于过滤包含您的 expected_value 的值,就像您在代码中所做的那样。 如果你想得到完全匹配,你可以使用:

df.loc[df['Result'].str.lower() == expected_value.lower()].to_csv(filename)

正如您在评论中建议的那样,对于多个标准,您将需要这样的东西:

expected_values = [expected_value1, expected_value2, expected_value3]
df[df['Result'].isin(expected_values)]

更新:

并过滤多个条件并过滤所需的列:

df.ix[df.isin(vals).any(axis=1)].loc[df['Result'].str.lower() == expected_value.lower()].to_csv(filename)

【讨论】:

您确定Result 是数字吗?他没有在任何有问题的地方提到这一点。 为什么?也许你是对的 :) 顺便说一句,只需将 df['EXPECTED']=expected_value 添加到你的代码中,因为如果你是正确的,你的解决方案会更好,如果你问我,那部分就会丢失。 是的,结果字段可能是也可能不是数字,这就是我将其视为字符串的原因。这种方法看起来不错,我正在尝试我有多个检查条件的情况@Boris 当然,我添加了另一种可能有帮助的方法。您还可以结合第一种和最后一种方法来转换为字符串并查找多个条件。 我已经更新了我的问题定义,如果你还能看一下@Boris【参考方案2】:

您应该创建一个数据框,其中有一列“RESULT”和一个“EXPECTED”。

然后您可以使用以下方法过滤匹配的行并将其仅输出到 csv:

df.ix[df['EXPECTED']==df['RESULT']].to_csv(filename)

【讨论】:

看起来是个不错的方法。我正在检查一个需要检查多个条件的案例。 @JulienMarrec 此外,文件中的某些行包含 NA / NAN 值。它会引发错误“无法使用包含 NA / NaN 值的向量进行索引” 如果您在问题中包含mcve,这将有助于测试您的特定应用程序

以上是关于如何使用从 python 中的 DataFrame 生成的结果写入 csv?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python Pandas DataFrame 中的循环结果中删除重复项?

如何从 Python Pandas Dataframe 中的 STRING 列中提取嵌套字典?

Python:从 DataFrame 中的两列创建结构化 numpy 结构化数组

如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区

如何从 Python 中两个不同 DataFrame 的值计数中绘制图表

使用 Python,如何按小时对 Dataframe 中的列进行分组?