如何使用for循环有效地将数据添加到数据帧中

2024-10-03 02:46:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从Python脚本中获取数据,并将其存储到一个列表中,然后从中创建一个数据帧

但它为for循环中的单个项创建了不同的Datafarme,如何避免这种情况,并创建一个单独的dataFrame

代码:

from __future__ import (absolute_import, division, print_function)
import getpass
import ssl
from pyVim.connect import SmartConnect
from pyVmomi import vim
from ssl import CERT_NONE, PROTOCOL_TLSv1_2, SSLContext
import pandas as pd
import numpy as np
from tabulate import tabulate
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('max_colwidth', None)
pd.set_option('expand_frame_repr', False)

s = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
s.verify_mode = ssl.CERT_NONE
userid = input("please enter your wbi userid (ex. abx@example.com):")
p = getpass.getpass("password:")
vcenter = ["vcenter-oracle.com","vcente.simplivity.com"]
for instance in vcenter:
    try:
        c = SmartConnect(host=instance, user=userid, pwd=p, sslContext=s)
    except Exception as e:
        print(e)
        continue
    content = c.content
    obj_ds = content.viewManager.CreateContainerView(content.rootFolder,[vim.Datastore],True)
# Lists
    a_list = []
    b_list = []
    c_list = []
    d_list = []
    
# for loop
    for z in obj_ds.view:
        a_list.append(instance)
        b_list.append(z)
        c_list.append(int(z.summary.capacity/(1024*1024*1024)))
        d_list.append(int(z.summary.freeSpace/(1024*1024*1024)))

#dataframe

    df = pd.DataFrame({'A': a_list, 'B': b_list, 'C': c_list, 'D': d_list})

对于for循环部分,我也尝试了以下方法,但结果相同:

    raw_data = []
    for z in obj_ds.view:
        vc_data = instance, z, int(z.summary.capacity/(1024*1024*1024)) ,int(z.summary.freeSpace/(1024*1024*1024))
        raw_data.append(vc_data)
    df = pd.DataFrame(raw_data, columns=['Vcenter', 'DS', 'TDS', 'FDS'])
    print(df)

输出:

                    A                              B      C     D
0   vcenter-oracle.com  'vim.Datastore:datastore-357'    439   430
1   vcenter-oracle.com  'vim.Datastore:datastore-311'    439   430
2   vcenter-oracle.com  'vim.Datastore:datastore-306'    439   430
3   vcenter-oracle.com  'vim.Datastore:datastore-262'  20480  7030
4   vcenter-oracle.com  'vim.Datastore:datastore-356'    439   430
5   vcenter-oracle.com  'vim.Datastore:datastore-465'     52    46
6   vcenter-oracle.com   'vim.Datastore:datastore-94'   5836  1850
7   vcenter-oracle.com  'vim.Datastore:datastore-122'  11646  3592
8   vcenter-oracle.com   'vim.Datastore:datastore-89'     52    46
9   vcenter-oracle.com   'vim.Datastore:datastore-83'     52    46
10  vcenter-oracle.com  'vim.Datastore:datastore-149'     52    46
                       A                                 B     C     D
0  vcenter.simplivity.com  'vim.Datastore:datastore-143230'  1945   501
1  vcenter.simplivity.com   'vim.Datastore:datastore-52354'  5120  2096
2  vcenter.simplivity.com  'vim.Datastore:datastore-142927'   274   271
3  vcenter.simplivity.com  'vim.Datastore:datastore-143231'  2048   987
4  vcenter.simplivity.com     'vim.Datastore:datastore-878'   553   549
5  vcenter.simplivity.com     'vim.Datastore:datastore-877'   553   552
6  vcenter.simplivity.com   'vim.Datastore:datastore-74327'  1500   949
7  vcenter.simplivity.com  'vim.Datastore:datastore-142929'   274   271
8  vcenter.simplivity.com     'vim.Datastore:datastore-708'  4677  1933    

              

期望值:

                    A                                   B      C     D
0   vcenter-oracle.com      'vim.Datastore:datastore-357'    439   430
1   vcenter-oracle.com      'vim.Datastore:datastore-311'    439   430
2   vcenter-oracle.com      'vim.Datastore:datastore-306'    439   430
3   vcenter-oracle.com      'vim.Datastore:datastore-262'  20480  7030
4   vcenter-oracle.com      'vim.Datastore:datastore-356'    439   430
5   vcenter-oracle.com      'vim.Datastore:datastore-465'     52    46
6   vcenter-oracle.com      'vim.Datastore:datastore-94'   5836  1850
7   vcenter-oracle.com      'vim.Datastore:datastore-122'  11646  3592
8   vcenter-oracle.com      'vim.Datastore:datastore-89'     52    46
9   vcenter-oracle.com      'vim.Datastore:datastore-83'     52    46
10  vcenter-oracle.com      'vim.Datastore:datastore-149'     52    46
11  vcenter.simplivity.com  'vim.Datastore:datastore-143230'  1945   501
12  vcenter.simplivity.com  'vim.Datastore:datastore-52354'  5120  2096
13  vcenter.simplivity.com  'vim.Datastore:datastore-142927'   274   271
14  vcenter.simplivity.com  'vim.Datastore:datastore-143231'  2048   987
15  vcenter.simplivity.com  'vim.Datastore:datastore-878'   553   549
16  vcenter.simplivity.com  'vim.Datastore:datastore-877'   553   552
17  vcenter.simplivity.com  'vim.Datastore:datastore-74327'  1500   949
18  vcenter.simplivity.com  'vim.Datastore:datastore-142929'   274   271
19  vcenter.simplivity.com  'vim.Datastore:datastore-708'  4677  1933 

                                                                       

Tags: fromimportcomsslforvimlistoracle
3条回答
# new df to concat every instance
final_df = pd.DataFrame()
for instance in vcenter:
    try:
        c = SmartConnect(host=instance, user=userid, pwd=p, sslContext=s)
    except Exception as e:
        print(e)
        continue
    content = c.content
    obj_ds = content.viewManager.CreateContainerView(content.rootFolder,[vim.Datastore],True)
# Lists
    a_list = []
    b_list = []
    c_list = []
    d_list = []
    
# for loop
    for z in obj_ds.view:
        a_list.append(instance)
        b_list.append(z)
        c_list.append(int(z.summary.capacity/(1024*1024*1024)))
        d_list.append(int(z.summary.freeSpace/(1024*1024*1024)))

#dataframe

    df = pd.DataFrame({'A': a_list, 'B': b_list, 'C': c_list, 'D': d_list})
    # append in final_df
    final_df = pd.concat([final_df, df])

# reset index
final_df = final_df.reset_index(drop=True)
print(final_df)

正如前面的回答中所提到的,您需要在第一个循环之前声明列表构造,就像在每次实例更改之后,raw_data重新初始化为空列表一样,几乎不需要做任何调整

试试下面,它应该适合你

s = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
s.verify_mode = ssl.CERT_NONE
userid = input("please enter your wbi userid (ex. abx@example.com):")
p = getpass.getpass("password:")
vcenter = ["vcenter-oracle.com","vcente.simplivity.com"]
# Place your list construct here
raw_data = []
# First loop
for instance in vcenter:
    try:
        c = SmartConnect(host=instance, user=userid, pwd=p, sslContext=s)
    except Exception as e:
        print(e)
        continue
    content = c.content
    obj_ds = content.viewManager.CreateContainerView(content.rootFolder,[vim.Datastore],True)
    # Second loop
    for z in obj_ds.view:
        vc_data = instance, z, int(z.summary.capacity/(1024*1024*1024)) ,int(z.summary.freeSpace/(1024*1024*1024))
        raw_data.append(vc_data)

 # Create the DataFrame and process the columns.
 # Keep the DataFrame outside the for loop.
df = pd.DataFrame(raw_data, columns=['Vcenter', 'DS', 'TDS', 'FDS'])
print(df)

代码中有两个for循环,您在第一个循环中初始化dataframe,这会导致您的情况,即为每个实例生成一个新的dataframe。您需要在第一个循环之前或在第一个循环之外初始化数据帧以获得单个数据帧

以下是更正后的代码:

df_rows = []
# first for loop
for instance in vcenter:
    try:
        c = SmartConnect(host=instance, user=userid, pwd=p, sslContext=s)
    except Exception as e:
        print(e)
        continue
    content = c.content
    obj_ds = content.viewManager.CreateContainerView(content.rootFolder,[vim.Datastore],True)
    # List for storing single row data
    row = []
    
    # second for loop
    for z in obj_ds.view:
        row.append(instance)
        row.append(z)
        row.append(int(z.summary.capacity/(1024*1024*1024)))
        row.append(int(z.summary.freeSpace/(1024*1024*1024)))
    df_rows.append(row)
df = pd.DataFrame(df_rows, columns=['A', 'B', 'C', 'D'])
print(df)

希望这有所帮助

相关问题 更多 >