2017-10-08 65 views
2

考虑下面dataframes,D1作为学生信息和d2为主题级结合1行数据帧和正行数据帧,通过复制1行,并追加到n行数据帧

>>> data = [['Alice',18]] 
>>> d1 = pd.DataFrame(data,columns=['Name','Age']) 
>>> d1 
    Name Age 
0 Alice 18 
>>> data2 = [['Science','A'],['Math','C'],['English','B']] 
>>> d2 = pd.DataFrame(data2, columns=['Subject','Grade']) 
>>> d2 
    Subject Grade 
0 Science  A 
1  Math  C 
2 English  B 

我想D1和D2与merge + assign + drop这样

Name Age Subject Grade 
0 Alice 18 Science  A 
1 Alice 18  Math  C 
2 Alice 18 English  B 

回答

4

使用交叉连接结合起来 - 如果想在d1组合多个行,则此解决方案可用于:

df = pd.merge(d1.assign(A=1), d2.assign(A=1), on='A').drop('A', 1) 
print (df) 
    Name Age Subject Grade 
0 Alice 18 Science  A 
1 Alice 18  Math  C 
2 Alice 18 English  B 

concatreindex另一种解决方案:

df = pd.concat([d1.reindex(d2.index, method='ffill'), d2], axis=1) 
print (df) 
    Name Age Subject Grade 
0 Alice 18 Science  A 
1 Alice 18  Math  C 
2 Alice 18 English  B 
+1

当然,我是重新索引不同;) – jezrael

+0

感谢它的作品! –

+0

不客气!如果我的或其他答案有帮助,请不要忘记[接受](http://meta.stackexchange.com/a/5235/295067) - 点击答案旁边的复选标记('✓')以切换它从灰色到填充。但只有一个答案应该被接受。谢谢。 – jezrael

2

您可以用assign

In [101]: d2.assign(**d1.iloc[0]) 
Out[101]: 
    Subject Grade Age Name 
0 Science  A 18 Alice 
1  Math  C 18 Alice 
2 English  B 18 Alice 

或者,

In [102]: d2.assign(**d1.iloc[0].to_dict()) 
Out[102]: 
    Subject Grade Age Name 
0 Science  A 18 Alice 
1  Math  C 18 Alice 
2 English  B 18 Alice 
2

您可以使用ffill即

CONCAT做
ndf = pd.concat([d1,d2],1).ffill() 
 
    Name Age Subject Grade 
0 Alice 18.0 Science  A 
1 Alice 18.0  Math  C 
2 Alice 18.0 English  B 
0

为什么不重建Dataframe

pd.DataFrame([data[0]+x for x in data2],columns=['Name','Age','Subject', 'Grade']) 
Out[279]: 
    Name Age Subject Grade 
0 Alice 18 Science  A 
1 Alice 18  Math  C 
2 Alice 18 English  B