2014-02-20 82 views
1

我想知道什麼是下列R-代碼的Python(熊貓)相當於:R參數DROP相當於在熊貓

outDataFrame <- myDataFrame[, rownames(inputDataFrame), drop=FALSE] 
  • inputDataFrame的行名是相同的myDataFrame的列名。
  • myDataframe的每一行只包含一個真值(所有其他值是FALSE)

結果outDataFrame應具備:

  • 同一行的名稱作爲myDataFrame行名稱
  • 只有一列
  • 該列中包含的值應該對應於值爲TRUE的myDataFrame的列名稱

我希望這是可以理解的......

親切的問候

R.

回答

0

一個方法是使用numpy.dot

>>> import numpy as np 
>>> import pandas as pd 
>>> df = pd.DataFrame ({ 'A':[False, True], 'B':[True, False] }, index=['row1', 'row2']) 
>>> df 
      A  B 
row1 False True 
row2 True False 

[2 rows x 2 columns] 

>>> pd.DataFrame(np.dot(df, df.columns), index=df.index) 
     0 
row1 B 
row2 A 

[2 rows x 1 columns] 

或者:

>>> df.apply(lambda row: df.columns[row][0], axis=1) 

它輸出一個pd.Series

+0

點布爾和字符串?這甚至如何工作? –

+0

@PhillipCloud它是魔術! –

0

這裏是另一種方式,用np.argmax

In [55]: myDataFrame = pd.DataFrame([(True,False,False), (False,False,True), (False,False,True)], index=list('ABC'), columns=list('XYZ')) 

In [56]: myDataFrame 
Out[56]: 
     X  Y  Z 
A True False False 
B False False True 
C False False True 

[3 rows x 3 columns] 

In [58]: pd.Series(myDataFrame.columns[np.argmax(myDataFrame.values, axis=1)], index=myDataFrame.index) 
Out[58]: 
A X 
B Z 
C Z 
dtype: object 

它的長,但也許更快尤其對於大dataframes:

In [76]: myDataFrame2 = pd.concat([myDataFrame]*10000) 

In [77]: %timeit pd.Series(myDataFrame2.columns[np.argmax(myDataFrame2.values, axis=1)], index=myDataFrame2.index) 
1000 loops, best of 3: 1.19 ms per loop 

In [78]: %timeit pd.Series(np.dot(myDataFrame2, myDataFrame2.columns), index=myDataFrame2.index) 
100 loops, best of 3: 5.72 ms per loop 

In [79]: %timeit myDataFrame2.apply(lambda row: myDataFrame2.columns[row][0], axis=1) 
1 loops, best of 3: 1.15 s per loop 
0

抱歉,我想我是不是在現實中清晰有兩個dataframes涉及:

myinput是df1和df2:

df1 = pd.DataFrame([(True,False,False), (False,False,True), (False,False,True)], index=list('XYZ'), columns=list('ABC')) 
df2 = pd.DataFrame([(1,2,1), (1,0,0), (1,1,1)], index=list('ABC'), columns=list('IJK')) 

,結果應該是一樣的:

0 
X A 
Y C 
Z C