【问题标题】:using pandas to_csv to write the result to a csv使用 pandas to_csv 将结果写入 csv
【发布时间】:2020-03-16 17:00:18
【问题描述】:

下面是我的代码,它从 excel 表中获取实例名称并在 aws 帐户中搜索实例名称并获取实例 ID。所以这个过程运行良好。现在我想将数据写入 csv,就像在 csv 中一样,必须有两列名称如 instancename 和 instanceId,并且数据应该打印在相应的列中。请帮助我获得所需的输出。 csv 与数据重叠,一旦打开 csv,我就可以看到其中的最后一个值,因为我的脚本会覆盖以前的结果。

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import numpy as np
import os
import boto3
client = boto3.client('ec2')
THIS_FOLDER = os.path.dirname(os.path.abspath(__file__))
my_file = os.path.join(THIS_FOLDER, 'example.xlsx')

df = pd.read_excel(my_file, sheet_name='Sheet2')

list1 = df['EC2NAMES']
print(list1)
client = boto3.client('ec2')
for names in list1:
    custom_filter = [{
        'Name':'tag:Name', 
        'Values': [names]}]
    print(names)
    instances = client.describe_instances(Filters=custom_filter)
    for instance in instances['Reservations']:
        for key in instance["Instances"]:
            x = key['InstanceId']
            print(x)
            data = pd.DataFrame({'A' : [names],'B' : [x]})
            data.to_csv('df111111.csv')

预期输出:

Instancename  InstanceID
testinstance  123456
testinstance1 12345656312
testinstance2 12345657237

实际输出:

Instancename  InstanceID
testinstance2 12345657237

【问题讨论】:

  • 每次循环都会覆盖 CSV 文件。
  • 您应该将所有数据合并到一个数据帧中,然后在最后将其写入 CSV 一次。
  • 请发布数据。 data.to_csv('df111111.csv') 在每次迭代中覆盖 data 对象
  • 我可以使用 to_csv@Barmar 在同一个 csv 中写入不同的工作表

标签: python pandas export-to-csv


【解决方案1】:

您可以使用 pandas concatappend,但最好的方法是将数据存储到列表中,最后制作一个数据框并将其保存为 csv。

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import numpy as np
import os
import boto3
client = boto3.client('ec2')
THIS_FOLDER = os.path.dirname(os.path.abspath(__file__))
my_file = os.path.join(THIS_FOLDER, 'example.xlsx')

df = pd.read_excel(my_file, sheet_name='Sheet2')

list1 = df['EC2NAMES']
print(list1)
client = boto3.client('ec2')
data = []
for names in list1:
    custom_filter = [{
        'Name':'tag:Name', 
        'Values': [names]}]
    print(names)
    instances = client.describe_instances(Filters=custom_filter)
    for instance in instances['Reservations']:
        for key in instance["Instances"]:
            x = key['InstanceId']
            print(x)
            data.append([names, x])
pd.DataFrame(data, colums=['A','B']).to_csv('df111111.csv')

【讨论】:

  • 感谢 poojan 的响应,但解决方案打印出与之前相同的响应。来自 Barmar 的以下输入,它起作用了。
  • @sree 代码中有一个小错误。修复了它,您现在可以运行解决方案了。
  • 这是因为将数据存储为列表比使用 pandas append 更简单吗? @Poojan
  • 是的,pandas 数据帧上的 append 方法肯定比仅将数据附加到列表要昂贵得多。
  • @Poojan 很高兴知道,有些文件比较大,这可能会有所帮助
【解决方案2】:

您的代码为 for 循环的每次迭代创建一个新的“数据”变量。我的尝试是在开始循环之前制作一个空白数据变量。在每个循环中向数据框添加一个新片段,一旦退出循环,就将其保存到 csv

data = pd.DataFrame()
list1 = df['EC2NAMES']
print(list1)
client = boto3.client('ec2')
for names in list1:
    custom_filter = [{
        'Name':'tag:Name', 
        'Values': [names]}]
    print(names)
    instances = client.describe_instances(Filters=custom_filter)
    for instance in instances['Reservations']:
        for key in instance["Instances"]:
            x = key['InstanceId']
            print(x)
            data = data.append(pd.DataFrame({'A' : [names],'B' : [x]}))
data.to_csv('df111111.csv')

【讨论】:

  • 感谢您的快速响应,但进行更改会创建一个空白的 df111111.csv
  • 我认为我的错误是倒数第二行,做了一个小改动,基本上我附加到数据变量但没有 data = data.append(...) 没有返回任何内容跨度>
  • 完美运行。谢谢巴尔玛
  • 请参阅下面的 poojans 评论,了解为什么他的方法更好
猜你喜欢
  • 2014-05-24
  • 2011-09-30
  • 2022-01-26
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
相关资源
最近更新 更多