在python中解析多个系列并重命名标题

在python中解析多个系列并重命名标题,python,pandas,import,Python,Pandas,Import,我的价格数据是这样的 你会看到 时间序列的起点和终点因两列和两列而不同 有一个空单元格需要填写“date_23340 KS Equity”或其他内容 我喜欢通过equities高效地导入这个巨大的文件,最重要的是,将空单元格的名称更改为“date_equities’name”。我怎样才能将它划分为由日期和值组成的单独数据帧 如果您对pandas从文件的第一行生成的自动头不满意,您可以跳过它,告诉pandas不要生成头并提供自己的头。 除此之外,您还可以选择要读取的列: df_1 = pd.rea

我的价格数据是这样的

你会看到

  • 时间序列的起点和终点因两列和两列而不同

  • 有一个空单元格需要填写“date_23340 KS Equity”或其他内容


  • 我喜欢通过equities高效地导入这个巨大的文件,最重要的是,将空单元格的名称更改为“date_equities’name”。我怎样才能将它划分为由日期和值组成的单独数据帧

    如果您对pandas从文件的第一行生成的自动头不满意,您可以跳过它,告诉pandas不要生成头并提供自己的头。 除此之外,您还可以选择要读取的列:

    df_1 = pd.read_csv("price.csv", usecols = [0,1], skiprows=1, header=['date', 'equity'])
    
    df_2 = pd.read_csv("price.csv", usecols = [2,3], skiprows=1, header=['date', 'equity'])
    

    首先按shift列名创建
    系列
    ,按第一个空格拆分并追加
    日期
    ,最后一个过滤器仅
    未命名
    索引值和
    重命名
    列名:

    s = df.columns.to_series().shift(-1).str.split(n=1).str[0] + ' Date'
    s = s[s.index.str.startswith('Unnamed')]
    print (s)
    Unnamed: 0    233740 Date
    Unnamed: 2    233160 Date
    dtype: object
    
    df = df.rename(columns=s)
    print (df)
      233740 Date  233740 KS Equity 233160 Date  233160 KS Equity
    0  2015-12-17           10330.0  2017-08-31           10460.0
    1  2015-12-18           10710.0  2017-09-01           10815.0
    2  2015-12-21           10720.0  2017-09-04           10835.0
    3  2015-12-22           10495.0  2017-09-05           10660.0
    4  2015-12-23           10425.0  2017-09-06           10535.0
    
    如果需要从所有数据中创建2或3列,请首先创建多索引,然后调用:

    编辑:

    多个不同标题的解决方案:

    #create dummy data
    df1 = df.copy()
    df1.columns = ['Unnamed: 4','233 JP Equity','Unnamed: 6','235 JP Equity']
    df = df.join(df1)
    print (df)
       Unnamed: 0  233740 KS Equity  Unnamed: 2  233160 KS Equity  Unnamed: 4  \
    0  2015-12-17           10330.0  2017-08-31           10460.0  2015-12-17   
    1  2015-12-18           10710.0  2017-09-01           10815.0  2015-12-18   
    2  2015-12-21           10720.0  2017-09-04           10835.0  2015-12-21   
    3  2015-12-22           10495.0  2017-09-05           10660.0  2015-12-22   
    4  2015-12-23           10425.0  2017-09-06           10535.0  2015-12-23   
    
       233 JP Equity  Unnamed: 6  235 JP Equity  
    0        10330.0  2017-08-31        10460.0  
    1        10710.0  2017-09-01        10815.0  
    2        10720.0  2017-09-04        10835.0  
    3        10495.0  2017-09-05        10660.0  
    4        10425.0  2017-09-06        10535.0  
    
    s = df.columns.to_series().shift(-1) + ' Date'
    s = s[s.index.str.startswith('Unnamed')]
    print (s)
    Unnamed: 0    233740 KS Equity Date
    Unnamed: 2    233160 KS Equity Date
    Unnamed: 4       233 JP Equity Date
    Unnamed: 6       235 JP Equity Date
    dtype: object
    
    df = df.rename(columns=s)
    
    在列表理解groupby first number中,同时创建dataetimeindex和concat。最后通过
    stack
    unstack
    对移除
    NaN
    s进行整形:

    f = lambda x: x.split(' ',1)[1]
    df = pd.concat([x.set_index(x.columns[0]).rename(columns=f) for i, x 
                    in df.groupby(df.columns.str.split(n=1).str[0], axis=1)], 1).stack().unstack()
    print (df)
                JP Equity  KS Equity
    2015-12-17    10330.0    10330.0
    2015-12-18    10710.0    10710.0
    2015-12-21    10720.0    10720.0
    2015-12-22    10495.0    10495.0
    2015-12-23    10425.0    10425.0
    2017-08-31    10460.0    10460.0
    2017-09-01    10815.0    10815.0
    2017-09-04    10835.0    10835.0
    2017-09-05    10660.0    10660.0
    2017-09-06    10535.0    10535.0
    

    非常感谢你,@jezrael,在制作新的列标题之前,你是对的。而且效果很好。然而,有一个小的缓存,不是所有股票都以“KS股票”结尾。数据中也有一些“JP股票”,因此结果是,
    val Date JP Equity KS Equity 0 069500 2013-01-02 NaN 27130.0 1 069660 2013-01-02 NaN 27110.0 2 091160 2013-01-02 NaN 16140.0 3 091170 2013-01-02 NaN 7540.0 4 091180 2013-01-02 NaN 20310.0
    也许我需要多做一点帮助……谢谢很多:)@HannahLee-当然,给我一些时间。@HannahLee-如果
    KS股票
    JP股票
    ,预期的产出是多少?3列?
    #create dummy data
    df1 = df.copy()
    df1.columns = ['Unnamed: 4','233 JP Equity','Unnamed: 6','235 JP Equity']
    df = df.join(df1)
    print (df)
       Unnamed: 0  233740 KS Equity  Unnamed: 2  233160 KS Equity  Unnamed: 4  \
    0  2015-12-17           10330.0  2017-08-31           10460.0  2015-12-17   
    1  2015-12-18           10710.0  2017-09-01           10815.0  2015-12-18   
    2  2015-12-21           10720.0  2017-09-04           10835.0  2015-12-21   
    3  2015-12-22           10495.0  2017-09-05           10660.0  2015-12-22   
    4  2015-12-23           10425.0  2017-09-06           10535.0  2015-12-23   
    
       233 JP Equity  Unnamed: 6  235 JP Equity  
    0        10330.0  2017-08-31        10460.0  
    1        10710.0  2017-09-01        10815.0  
    2        10720.0  2017-09-04        10835.0  
    3        10495.0  2017-09-05        10660.0  
    4        10425.0  2017-09-06        10535.0  
    
    s = df.columns.to_series().shift(-1) + ' Date'
    s = s[s.index.str.startswith('Unnamed')]
    print (s)
    Unnamed: 0    233740 KS Equity Date
    Unnamed: 2    233160 KS Equity Date
    Unnamed: 4       233 JP Equity Date
    Unnamed: 6       235 JP Equity Date
    dtype: object
    
    df = df.rename(columns=s)
    
    f = lambda x: x.split(' ',1)[1]
    df = pd.concat([x.set_index(x.columns[0]).rename(columns=f) for i, x 
                    in df.groupby(df.columns.str.split(n=1).str[0], axis=1)], 1).stack().unstack()
    print (df)
                JP Equity  KS Equity
    2015-12-17    10330.0    10330.0
    2015-12-18    10710.0    10710.0
    2015-12-21    10720.0    10720.0
    2015-12-22    10495.0    10495.0
    2015-12-23    10425.0    10425.0
    2017-08-31    10460.0    10460.0
    2017-09-01    10815.0    10815.0
    2017-09-04    10835.0    10835.0
    2017-09-05    10660.0    10660.0
    2017-09-06    10535.0    10535.0