R参数DROP在Pandas中等效

时间:2014-02-20 12:51:49

标签: python r select pandas

我想知道以下R代码的Python(Pandas)等价物是什么:

outDataFrame <- myDataFrame[, rownames(inputDataFrame), drop=FALSE]
  • inputDataFrame的行名称与myDataFrame的列名称相同。
  • myDataframe的每一行只包含一个TRUE值(所有其他值都为FALSE)

结果outDataFrame应该有:

  • 与myDataFrame行名称相同的行名称
  • 只有一栏
  • 该列中包含的值应对应于值为TRUE的myDataFrame的列名称

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

亲切的问候

R上。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

它很长但可能更快,特别是对于大型数据帧:

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

答案 2 :(得分:0)

抱歉,我认为实际上我不清楚是否涉及两个数据帧:

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