Файл CSV в определенный формат - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть такой текстовый файл:

APAC230_WINC230,P1-2,Transline,17002,APACHE,230,17105,WINCHSTR,230,1
WINC345_VAIL345,P1-2,Transline,16109,WINCHSTR,345,16105,VAIL,345,1
WINC345_VAIL345,P1-2,Transline,16109,WINCHSTR,345,16105,VAIL,345,1a

Я хочу иметь возможность преобразовать список во что-то вроде этого:

APAC230_WINC230,P1-2
Transline,17002,APACHE,230,17105,WINCHSTR,230,1
WINC345_VAIL345,P1-2
Transline,16109,WINCHSTR,345,16105,VAIL,345,1
Transline,16109,WINCHSTR,345,16105,VAIL,345,1a

Используя панд read_CSV, я могу создатьсписок, аналогичный приведенному выше, но я сталкиваюсь с проблемами с сущностями, которые имеют более одного элемента.

Например, это вывод, который я могу создать:

APAC230_WINC230,P1-2
Transline,17002,APACHE,230,17105,WINCHSTR,230,1
WINC345_VAIL345,P1-2
Transline,16109,WINCHSTR,345,16105,VAIL,345,1
WINC345_VAIL345,P1-2
Transline,16109,WINCHSTR,345,16105,VAIL,345,1a

Я имею дело с оченьбольшие списки, так что мне слишком сложно просто удалить дубликаты, также сущности имеют различные имена.

Вот мой код:

import pandas as pd 
def cgy(input_file):
    rows=['cgy','cat_con_evt','type','frombusid','frombus','frombuskv',
    'tobusid','tobus','tobuskv','circuitid']
    df = pd.read_csv(input_file,names=rows,dtype=object)
    cgy_file = ""
    cgy_file = input("Enter output file name:")
    with open(cgy_file, 'w') as f:
        for i in range(0,len(df)):
            print(df.loc[i]['cgy']+","+df.loc[i]['cat_con_evt'], file=f)
            print(df.loc[i]['type']+","+
            df.loc[i]['frombusid']+","+df.loc[i]['frombus']+","+df.loc[i]['frombuskv']+","+
            df.loc[i]['tobusid']+","+df.loc[i]['tobus']+","+df.loc[i]['tobuskv']+","+df.loc[i]['circuitid'],file=f)
def main():

    input_file = ""
    input_file = input("Enter input file name: ")
    cgy(input_file)
if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 12 декабря 2018

Я предлагаю создать фрейм данных с 2 столбцами, содержащий первые 2 и последние 8 элементов каждой строки в текстовом файле.

Скопировать данные текстового файла:

APAC230_WINC230,P1-2,Transline,17002,APACHE,230,17105,WINCHSTR,230,1
WINC345_VAIL345,P1-2,Transline,16109,WINCHSTR,345,16105,VAIL,345,1
WINC345_VAIL345,P1-2,Transline,16109,WINCHSTR,345,16105,VAIL,345,1a

и запустите следующий код:

# import data
df = pd.read_clipboard(sep=',',header =None, names = ['cgy','cat_con_evt','type','frombusid','frombus','frombuskv',
    'tobusid','tobus','tobuskv','circuitid'])
# convert all columns to string
df = df.applymap(str)
# create new columns 'A' and 'B' as explained
columnsA = ['cgy','cat_con_evt']
columnsB = ['type','frombusid','frombus','frombuskv','tobusid','tobus','tobuskv','circuitid']
df['A'] = df[columnsA].apply(lambda x: ','.join(x.fillna('')), axis=1)
df['A'] = df['A'].str.strip(',')
df['B'] = df[columnsB].apply(lambda x: ','.join(x.fillna('')), axis=1)
df['B'] = df['B'].str.strip(',')
# drop useless columns
df = df.drop(columnsA + columnsB , axis=1).sort_values('A')
# print desired output
for x in df.A.unique().tolist():
    print(x)
    l = df[df['A']==x]['B'].tolist()
    for y in l:
        print(y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...