Есть ли простой способ использовать индекс строки для хранения подмножества данных в DataFrames, чтобы в конечном итоге объединить обратно в CSV, используя Python Pandas - PullRequest
0 голосов
/ 09 апреля 2020

Я изучаю pandas и пытаюсь понять, как я могу создать структурированный формат DF.txt в DF.csv с колонками ниже. Ниже приведен код, которым я управлял до сих пор.

import pandas as pd
import numpy as np
df = pd.read_csv('DF.txt', header=None)

# Get Row Index for Starting Rows
header_list = df[df[0].str.contains('kbytes')].index.values

# Get Row Index for Ending Rows
end_list = df[df[0].str.contains('^#')].index.values

# Create List if List (Start / End Row)
idx_list = []
for x in header_list:
    y = end_list[np.where(x<end_list)]
    if len(y)>0:        
        idx_list.append([x, y[0]]) # We are using the first number in array y e.g. y[0]
    else:
        idx_list.append([x,]) # End of file has no y[0]s
print (idx_list)

for idxs in idx_list:
    if len(idxs)>1:
        # df[idx_list[0][0]:idx_list[0][1]] - first block of rows df[2:137]
        # df[idx_list[1][0]:idx_list[1][1]] - second block of rows df[139:274]
        # df[idx_list[2][0]:idx_list[2][1]] - third block of rows df[276:417]
        print (idxs)
        # Need to extract following values
            # Filesystem
            # kbytes
            # used
            # avail
            # capacity
            # Mounted on            
            # Date (e.g. 2 rows up and extract dt.strftime("%d/%m/%Y %H:%M:%S"))
            # Type (e.g. 2 rows up and extract '\((.*?)\)')
            # hostname (e.g. 1 row up and split by :)
            # serialno (e.g. 1 row up and split by :)

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

По сути, ищем более простой способ достижения ниже -

for idxs in idx_list:
    if len(idxs)>1:
        #print(idxs)                   # Print all lists in the list
        #print df.loc[idxs[0]:idxs[1]] # Return dataframe with rows from first list
        #print df[idxs[0]:idxs[1]][0]  # Return an array for column (index 0) instead of dataframe
        print df[idxs[0]:idxs[1]][0][1:]  # skip first items from array
        # lambda function to iterate each item split by whitespace (default) and return the first item (index 0 i.e. e.g. Filesystem)
        #df.loc[idxs[0]:idxs[1],'Filesystem'] = df[idxs[0]:idxs[1]][0][2:].apply(lambda x: str.split(x)[0])
for idxs in idx_list:
    if len(idxs)>1:
        print(idxs)
        df.loc[idxs[0]:idxs[1],'Filesystem'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[0])
        df.loc[idxs[0]:idxs[1],'kbytes'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[1])
        df.loc[idxs[0]:idxs[1],'used'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[2])
        df.loc[idxs[0]:idxs[1],'avail'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[3])
        df.loc[idxs[0]:idxs[1],'capacity'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[4])
        df.loc[idxs[0]:idxs[1],'Mounted on'] = df[idxs[0]:idxs[1]][0][1:].apply(lambda x: str.split(x)[5])

        df.loc[idxs[0]:idxs[1],'date'] = pd.to_datetime(df[idxs[0]-2:idxs[1]-1][0].str[6:26][0:1]).dt.strftime("%d/%m/%Y %H:%M:%S").values[0]
        df.loc[idxs[0]:idxs[1],'ASUP_Type'] = df[idxs[0]-2:idxs[1]-1][0].str.extract('\((.*?)\)', expand=True)[0].values[0]
        df.loc[idxs[0]:idxs[1],'hostname'] = df[idxs[0]-1:idxs[1]][0].str.split().values[0][2]
        df.loc[idxs[0]:idxs[1],'serial_no'] = df[idxs[0]-1:idxs[1]][0].str.split().values[0][4]
    else:
        print(idxs)
        df.loc[idxs[0]:,'Filesystem'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[0])
        df.loc[idxs[0]:,'kbytes'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[1])
        df.loc[idxs[0]:,'used'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[2])
        df.loc[idxs[0]:,'avail'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[3])
        df.loc[idxs[0]:,'capacity'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[4])
        df.loc[idxs[0]:,'Mounted on'] = df[idxs[0]:][0][1:].apply(lambda x: str.split(x)[5])

        df.loc[idxs[0]:,'date'] = pd.to_datetime(df[idxs[0]-2:-1][0].str[6:26][0:1]).dt.strftime("%d/%m/%Y %H:%M:%S").values[0]
        df.loc[idxs[0]:,'ASUP_Type'] = df[idxs[0]-2:-1][0].str.extract('\((.*?)\)', expand=True)[0].values[0]
        df.loc[idxs[0]:,'hostname'] = df[idxs[0]-1:][0].str.split().values[0][2]
        df.loc[idxs[0]:,'serial_no'] = df[idxs[0]-1:][0].str.split().values[0][4]
0 голосов
/ 09 апреля 2020

Это дает вам строки с 5 по 8. df.loc[5:8,:]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...