对列表中的每个项目重复整个 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.repeat
和 np.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
我想为列表中的每一年重复一个 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.repeat
和 np.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