2014-11-21 156 views
1

我有兩個Pandas DataFrame。我想添加其他數據框的行作爲另一列中的列。我試過閱讀合併,連接和連接 - 文檔,但是我不知道如何在熊貓中做到這一點。Pandas中的Dataframe行的數據幀列

下面是我設法做到這一點與轉換爲numpy數組,但肯定有一個聰明的方式來做到這一點熊貓。

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(np.random.normal(size=8).reshape(4,2),index=[1,2,3,4],columns=['a','b']) 
df2 = pd.DataFrame(np.random.normal(size=8).reshape(2,4),index=['c','d'],columns=[5,6,7,8]) 
ar = np.concatenate((df1.values,df2.values.T),axis=1) 
df = pd.DataFrame(ar,columns=['a','b','c','d'],index=[1,2,3,4]) 

回答

3

如果df1.index沒有重複的值,那麼你可以使用df1.join

In [283]: df1 = pd.DataFrame(np.random.normal(size=8).reshape(4,2),index=[1,2,3,4],columns=['a','b']) 

In [284]: df2 = pd.DataFrame(np.random.normal(size=8).reshape(2,4),index=['c','d'],columns=[5,6,7,8]) 

In [285]: df1.join(df2.T.set_index(df1.index)) 
Out[285]: 
      a   b   c   d 
1 -1.196281 0.222283 1.247750 -0.121309 
2 1.188098 0.384871 -1.324419 -1.610255 
3 -0.928642 -0.618491 0.171215 -1.545479 
4 -0.832756 -0.491364 0.100428 -0.525689 

如果df1在其索引中重複的條目,然後df1.join(...)可能會比預期的返回更多的行。例如,如果具有df1非唯一索引[1,2,1,4]然後:

In [4]: df1 = pd.DataFrame(np.random.normal(size=8).reshape(4,2),index=[1,2,1,4],columns=['a','b']) 

In [5]: df2 = pd.DataFrame(np.random.normal(size=8).reshape(2,4),index=['c','d'],columns=[5,6,7,8]) 

In [8]: df1.join(df2.T.set_index(df1.index)) 
Out[8]: 
      a   b   c   d 
1 -1.087152 -0.828800 -1.129768 -0.579428 
1 -1.087152 -0.828800 0.320756 0.297736 
1 0.198297 0.277456 -1.129768 -0.579428 
1 0.198297 0.277456 0.320756 0.297736 
2 1.529188 1.023568 -0.670853 -0.466754 
4 -0.393748 0.976632 0.455129 1.230298 

df1的2行具有索引1 df2被接合到2行具有索引1所得4行與索引1 - 可能不是你想要的。

所以,如果df1.index不包含重複值,使用pd.concat保證兩個形狀的簡單並列:

In [7]: pd.concat([df1, df2.T.set_index(df1.index)], axis=1) 
Out[7]: 
      a   b   c   d 
1 -1.087152 -0.828800 -1.129768 -0.579428 
2 1.529188 1.023568 -0.670853 -0.466754 
1 0.198297 0.277456 0.320756 0.297736 
4 -0.393748 0.976632 0.455129 1.230298 
你可能想使用 df1.join

的原因之一,然而,就是 如果你知道df1.index有沒有重複的值,然後用它 比使用pd.concat快:

In [13]: df1 = pd.DataFrame(np.random.normal(size=8000).reshape(-1,2), columns=['a','b']) 

In [14]: df2 = pd.DataFrame(np.random.normal(size=8000).reshape(2,-1),index=['c','d']) 

In [15]: %timeit df1.join(df2.T.set_index(df1.index)) 
1000 loops, best of 3: 600 µs per loop 

In [16]: %timeit pd.concat([df1, df2.T.set_index(df1.index)], axis=1) 
1000 loops, best of 3: 1.18 ms per loop 
相關問題