【问题标题】:Repeat entire df, for each item in a list [duplicate]为列表中的每个项目重复整个 df [重复]
【发布时间】:2020-02-14 23:18:00
【问题描述】:

我想在列表中为每年重复一个 df。

df 每次重复时,它还应该在一个名为“year”的新列中添加与迭代对应的年份。

我有:

>>> ls = ['2019','2018','2017','2016']
>>> df = pd.DataFrame(['a','b'])
>>> df
   0
0  a
1  b

我想要:

>>> df
   0    year
0  a  '2019'
1  b  '2019'
2  a  '2018'
3  b  '2018'
4  a  '2017'
5  b  '2017'
6  a  '2016'
7  b  '2016'

【问题讨论】:

    标签: python pandas dataframe repeat


    【解决方案1】:
    import pandas as pd
    
    ls = ['2019','2018','2017','2016','2015']
    
    col = []
    for i, year in enumerate(ls):
      col.append('b' if i%2 else 'a')
    
    df = pd.DataFrame.from_dict({
      '0': col,
      'year': ls,
    })
    
    print(df)
    

    输出:

       0  year
    0  a  2019
    1  b  2018
    2  a  2017
    3  b  2016
    4  a  2015
    

    【讨论】:

      【解决方案2】:

      你可以使用np.repeatnp.tile

      new_df = (df.loc[np.tile(df.index, len(ls))]
                  .reset_index(drop=True)
                  .assign(Year=np.repeat(ls, len(df)))
               )
      

      输出:

         0  Year
      0  a  2019
      1  b  2019
      2  a  2018
      3  b  2018
      4  a  2017
      5  b  2017
      6  a  2016
      7  b  2016
      

      【讨论】:

        【解决方案3】:

        您可以进行笛卡尔连接。

        df = pd.DataFrame(['a','b'])
        dates = pd.DataFrame(['2019','2018','2017','2016'])
        
        df = df.assign(key=1).merge(dates.assign(key=1), on='key').drop('key', axis=1)
        df.columns = [0, 'year']
        df = df.sort_values('year', ascending=False).reset_index(drop=True)
        
        print(df)
           0  year
        0  a  2019
        1  b  2019
        2  a  2018
        3  b  2018
        4  a  2017
        5  b  2017
        6  a  2016
        7  b  2016
        

        【讨论】:

          【解决方案4】:

          这实际上是在变相使用列表的笛卡尔积,并且使用了neat solution

          import pandas as pd
          pd.DataFrame(index=pd.MultiIndex.from_product([[2019,2018,2017,2016], ['a','b']],
              names=['Year','Value'])).reset_index()
          
             Year Value
          0  2019     a
          1  2019     b
          2  2018     a
          3  2018     b
          4  2017     a
          5  2017     b
          6  2016     a
          7  2016     b
          

          【讨论】:

            猜你喜欢
            • 2013-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-12
            • 1970-01-01
            • 1970-01-01
            • 2020-11-03
            相关资源
            最近更新 更多