代码之家  ›  专栏  ›  技术社区  ›  bigjdawg43

迭代多个数据帧中的列并有条件地执行操作

  •  1
  • bigjdawg43  · 技术社区  · 10 月前

    我有三个时间序列数据帧

    df_list=[px, SC, SMA]
    

    每个数据帧都有相同的列和相同的日期。我还有一份证券清单(为了示例的目的而简化):

    securities3=['SPX Index','BIL US Equity']
    

    我正在尝试执行以下操作,但语法不正确:

    for df in df_list:
        for col in df.columns:       
            if col==securities3:
                ***create new dataframe here***
    

    换句话说,我想迭代df_list中的每个数据帧,在df的每一列中,当该列与securities3的组件匹配时,我希望用这三列(每个数据帧一列,匹配securities3list)形成一个新的数据帧。

    要提供更多详细信息,请参阅下面的示例数据:

    import pandas as pd
    
    px_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
            'SPX Index': [58.63, 21.25, 19.17, 18.8],
            'BIL US Equity': [35,105,27,98]}
    
    SC_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
            'SPX Index': [20.50, 6, 82, 74.6],
            'BIL US Equity': [74,62,8,99]}
    
    SMA_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
            'SPX Index': [2, 95.3, 39, 68.27],
            'BIL US Equity': [58,37,74,11]}
    
    px = pd.DataFrame(px_data)
    SC = pd.DataFrame(SC_data)
    SMA = pd.DataFrame(SMA_data)
    

    目标输出为:

    SPX_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
         'SPX Index': [58.63, 21.25, 19.17, 18.8],
         'SPX Index': [20.50, 6, 82, 74.6],
         'SPX Index': [2, 95.3, 39, 68.27]}
        
    SPX = pd.DataFrame(SPX_data)
    

    我试图在循环中创建SPX数据帧(例如),因为列表(securities3)可能会发生变化。此外,作为参考,由于这是一个更大过程的一部分,数据帧中的列将始终与列表中的字符串(和位置)相同,就像本例中一样。

    谢谢你的帮助。

    1 回复  |  直到 10 月前
        1
  •  1
  •   e-motta    10 月前

    假设所有数据帧都有相同的日期和顺序,您可以将日期+列与上的值连接起来 axis=1 :

    date = df_list[0]["Date"]
    out = [pd.concat([date] + [df[sec] for df in df_list], axis=1) for sec in securities3]
    
    for df in out:
        print(df)
    
          Date  SPX Index  SPX Index  SPX Index
    0  8/11/18      58.63       20.5       2.00
    1  8/12/18      21.25        6.0      95.30
    2  8/13/18      19.17       82.0      39.00
    3  8/14/18      18.80       74.6      68.27
          Date  BIL US Equity  BIL US Equity  BIL US Equity
    0  8/11/18             35             74             58
    1  8/12/18            105             62             37
    2  8/13/18             27              8             74
    3  8/14/18             98             99             11
    

    更新:

    如果 'Date' 如果是索引,请从中删除日期 concat 电话。

    如果你想让每个数据帧都在一个变量中,请删除列表理解中的外循环。

    for sec in securities3:
        df = pd.concat([df[sec] for df in df_list], axis=1)