2017-10-08 88 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