对列表中的每个项目重复整个 df

Repeat entire df, for each item in a list

我想为列表中的每一年重复一个 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'
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

您可以使用 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

您可以进行笛卡尔连接。

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

这实际上是伪装列表的笛卡尔积,并使用这个 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