【问题标题】:CSV file to a specific formatCSV 文件为特定格式
【发布时间】:2018-12-11 21:16:29
【问题描述】:

我有一个这样的文本文件:

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

使用 pandas 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()

【问题讨论】:

    标签: python pandas csv formatting


    【解决方案1】:

    我建议创建一个包含 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2019-03-18
      • 2022-01-04
      • 2015-01-04
      • 2019-12-20
      相关资源
      最近更新 更多