大熊猫:合并数据框和系列/填充缺少的数据点

时间:2018-08-27 18:00:01

标签: python pandas

我想合并pd.DataFramepd.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

xpd.DataFrame

print(y)

>>> 0    100
1    200
2    300
3    400

ypd.Series。 我想将此数据用作movie中的x列。 对于xy,我想要一个类似这样的结果:

    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中一样。

3 个答案:

答案 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)

您可以使用groupbyreindex重新索引y.values上的每个ID。然后,您可以重置索引,并按每个组分别ffillbfill列中的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