2014-03-25 106 views
16

我有一個DataFrame(df1),其維度爲2000 rows x 500 columns(不包括索引),我想用另一個DataFrame(df2)將其劃分爲1 rows X 500 columns。兩者都有相同的列標題。我想:Python:將DataFrame的每一行除以另一個DataFrame矢量

df.divide(df2)df.divide(df2, axis='index')和多種其他的解決方案,我總是得到一個DF與每一個細胞nan值。我在函數df.divide中缺少什麼論點?

回答

21

df.divide(df2, axis='index'),您需要提供DF2軸/行(例如df2.iloc[0])。

import pandas as pd 

data1 = {"a":[1.,3.,5.,2.], 
     "b":[4.,8.,3.,7.], 
     "c":[5.,45.,67.,34]} 
data2 = {"a":[4.], 
     "b":[2.], 
     "c":[11.]} 

df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 

df1.div(df2.iloc[0], axis='columns') 

,或者您可以使用df1/df2.values[0,:]

+0

有很大的幫助!謝謝。我試過兩種解決方案。 – Plug4

+0

非常好。答案的第一句中說明了關鍵信息 - DataFrame必須除以一個向量(pd.Series)。 –

10

您可以通過系列即DF2的第一行劃分:

In [11]: df = pd.DataFrame([[1., 2.], [3., 4.]], columns=['A', 'B']) 

In [12]: df2 = pd.DataFrame([[5., 10.]], columns=['A', 'B']) 

In [13]: df.div(df2) 
Out[13]: 
    A B 
0 0.2 0.2 
1 NaN NaN 

In [14]: df.div(df2.iloc[0]) 
Out[14]: 
    A B 
0 0.2 0.2 
1 0.6 0.4 
5

小澄以防萬一:爲什麼會得到NaN的無處不在,而安迪的第一個例子(df.div(df2))工程第一線的原因是格嘗試匹配索引(和列)。在安迪的例子中,在兩個數據幀中都找到了索引0,所以進行了劃分,而不是索引1,因此添加了一行NaN。

df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't']) 
df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t']) 
df_a.div(df_b) 

所以你的情況,DF2的唯一行的指數顯然是不存在的DF1:如果您運行以下(只有「T」線劃分)這種現象應該會出現更加明顯。 「幸運的是,這兩個數據框中的列標題相同,因此當您對第一行進行切片時,會得到一系列的索引,其索引由df2的列標題組成。這是最終允許師正確發生的原因。

對於索引和列匹配的情況下:

df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't'], columns = range(5)) 
df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t'], columns = [1,2,3,4,5]) 
df_a.div(df_b) 
1

如果要分割帶有特定值的列的每一行,你可以嘗試:

df['column_name'] = df['column_name'].div(10000) 

對於我來說,這個代碼將'column_name'的每一行分隔爲10,000。

-2

來劃分行(有單個或多個列),我們需要做以下:

df.loc['index_value'] = df.loc['index_value'].div(10000) 
相關問題