【问题标题】:Merge two columns of equal length into one将两列长度相等的列合并为一列
【发布时间】:2018-12-31 15:58:39
【问题描述】:

我有一个包含多列的 pandas DataFrame。我想要完成的是将两列的值组合/堆叠成一列,将每一列的值逐行堆叠(不幸的是,这个要求阻止我使用类似联合的解决方案)。其他剩余列的内容可以复制。非常感谢任何帮助

#Current DataFrame
print(df)
Stock Ticker    Index Ticker    Price   Date
AAPL            INDX            100     12/31/2018 8:57  
GOOG            RSL             123     12/31/2018 8:57
GM              COMP            90      12/31/2018 8:57
MMM             NIKK            340     12/31/2018 8:57
INVD            EUR             30      12/31/2018 8:57 

#Desired results
print(df2)
Stock and Bench   Price   Date
AAPL              100     12/31/2018 8:57
INDX              100     12/31/2018 8:57
GOOG              123     12/31/2018 8:57
RSL               123     12/31/2018 8:57
GM                90      12/31/2018 8:57
COMP              90      12/31/2018 8:57
MMM               340     12/31/2018 8:57
NIKK              340     12/31/2018 8:57
INVD              30      12/31/2018 8:57
EUR               30      12/31/2018 8:57

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    您可以将价格和日期列设置为索引并堆叠股票和股票代码。最后使用 reset_index 进行一些清理。

    df.set_index(['Date', 'Price'])[['Stock Ticker','Index Ticker']].stack()\
    .reset_index(2,drop = True).reset_index(name = 'Stock and Bench')
    
    
        Date    Price   Stock and Bench
    0   12/31/2018 8:57 100 AAPL
    1   12/31/2018 8:57 100 INDX
    2   12/31/2018 8:57 123 GOOG
    3   12/31/2018 8:57 123 RSL
    4   12/31/2018 8:57 90  GM
    5   12/31/2018 8:57 90  COMP
    6   12/31/2018 8:57 340 MMM
    7   12/31/2018 8:57 340 NIKK
    8   12/31/2018 8:57 30  INVD
    9   12/31/2018 8:57 30  EUR
    

    【讨论】:

      【解决方案2】:

      您可以使用pd.melt 设置DatePriceid_vars

      (df.melt(id_vars=['Date', 'Price'], 
               value_name='Stock and Bench')
               .drop('variable', axis=1))
      
               Date        Price     Stock and Bench
      0  12/31/2018/8:57    100            AAPL
      1  12/31/2018/8:57    123            GOOG
      2  12/31/2018/8:57     90              GM
      3  12/31/2018/8:57    340             MMM
      4  12/31/2018/8:57     30            INVD
      5  12/31/2018/8:57    100            INDX
      6  12/31/2018/8:57    123             RSL
      7  12/31/2018/8:57     90            COMP
      8  12/31/2018/8:57    340            NIKK
      9  12/31/2018/8:57     30             EUR
      

      或者使用pd.wide_to_long:

      (pd.wide_to_long(df.reset_index(), stubnames='Ticker', i = 'index', 
                      j = 'num', suffix='\w+')
                      .reset_index(drop=True)
                      .rename({'Ticker':'Stock and Bench'}, axis=1))
      
              Date         Price Stock and Bench
      0  12/31/2018-8:57    100   AAPL
      1  12/31/2018-8:57    123   GOOG
      2  12/31/2018-8:57     90     GM
      3  12/31/2018-8:57    340    MMM
      4  12/31/2018-8:57     30   INVD
      5  12/31/2018-8:57    100   INDX
      6  12/31/2018-8:57    123    RSL
      7  12/31/2018-8:57     90   COMP
      8  12/31/2018-8:57    340   NIKK
      9  12/31/2018-8:57     30    EUR
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多