我想合并pd.DataFrame
和pd.Series
,包括所有丢失的数据。
print(x)
>>> movie rating user
0 100 1 1
1 200 4 1
2 300 3 1
3 100 5 2
4 200 3 2
5 300 2 3
x
是pd.DataFrame
。
print(y)
>>> 0 100
1 200
2 300
3 400
y
是pd.Series
。
我想将此数据用作movie
中的x
列。
对于x
和y
,我想要一个类似这样的结果:
movie rating user
0 100 1.0 1
1 200 4.0 1
2 300 3.0 1
3 400 NaN 1
4 100 5.0 2
5 200 3.0 2
6 300 NaN 2
7 400 NaN 2
8 100 NaN 3
9 200 NaN 3
10 300 2.0 3
11 400 NaN 3
每个用户的合并数据基本上应为x
,其列为movie=[100,200,300,400]
,就像y
中一样。
答案 0 :(得分:6)
unstack
+ stack
+ reindex
x.set_index(['user','movie']).rating.unstack().\
reindex(columns=y).\
stack(dropna=False).\
reset_index(name='rating')
Out[40]:
user movie rating
0 1 100 1.0
1 1 200 4.0
2 1 300 3.0
3 1 400 NaN
4 2 100 5.0
5 2 200 3.0
6 2 300 NaN
7 2 400 NaN
8 3 100 NaN
9 3 200 NaN
10 3 300 2.0
11 3 400 NaN
答案 1 :(得分:1)
您可以使用groupby
和reindex
重新索引y.values
上的每个ID。然后,您可以重置索引,并按每个组分别ffill
和bfill
列中的user
列来填充NaN
值:
new = (x.groupby('user',as_index=False)
.apply(lambda i: i.set_index('movie').reindex(y.values))
.reset_index('movie'))
new['user'] = new.groupby(new.index)['user'].ffill().bfill().astype(int)
>>> new
movie rating user
0 100 1.0 1
0 200 4.0 1
0 300 3.0 1
0 400 NaN 1
1 100 5.0 2
1 200 3.0 2
1 300 NaN 2
1 400 NaN 2
2 100 NaN 3
2 200 NaN 3
2 300 2.0 3
2 400 NaN 3
答案 2 :(得分:1)
我个人更喜欢@Wen的解决方案,但请注意,您可以创建所需的 constructor(private router: Router) {
router.events.pipe(
filter((evt) => evt instanceof NavigationEnd)
).subscribe((_: NavigationEnd) => {
this.currentUrl = _.url;
});
和user
列,然后将其与原始movie
合并: >
DataFrame