我有一个结构类似于下面的数据帧(但在实际情况中,有更多的行和列)。在
In [2]: Ex # The example DataFrame
Out[2]:
NameBef v1B v2B v3B v4B NameAft v1A v2A v3A v4A
Id
422 firstBef 133 145 534 745 FirstAft 212 543 2342 4563
862 secondBef 234 434 345 3453 SecondAft 643 493 3433 234
935 thirdBef 232 343 6454 463 thirdAft 423 753 754 743
对于每一行,我想计算上面每个vXB和vXA值的商(x是变量),最后得到一个像这样的数据帧
^{pr2}$其中每个元素是原始数据帧的相应元素的商。在
我不知道怎么方便地做这个。在
为了方便起见,如果不要求只提供“before”和“after”值(即“v1B”、“v4B”和“v1A”、“v4A”)的第一列和最后一列的名称(即不是每列)。在
以下是我想到的。在
In [3]: C=Ex.columns
In [4]: C1B=C.get_loc('v1B')
In [5]: C2B=C.get_loc('v4B')
In [6]: C1A=C.get_loc('v1A')
In [7]: C2A=C.get_loc('v4A')
In [8]: FB=Ex.ix[:,C1B:C2B+1]
In [9]: FA=Ex.ix[:,C1A:C2A+1]
In [10]: FB # The FB and FA frames have this structure
Out[10]:
v1B v2B v3B v4B
Id
422 133 145 534 745
862 234 434 345 3453
935 232 343 6454 463
[3 rows x 4 columns]
最后生成所需的数据帧。这是通过对DataFrame.values
生成的numpy数组进行计算来完成的。在
我从这个question/answer得到的方法:
In [12]: DataFrame((FA.values*1.0) / FB.values,columns=['v1Q','v2Q','v3Q','v4Q'],index=Ex.index)
Out[12]:
v1Q v2Q v3Q v4Q
Id
422 1.593985 3.744828 4.385768 6.124832
862 2.747863 1.135945 9.950725 0.067767
935 1.823276 2.195335 0.116827 1.604752
[3 rows x 4 columns]
我错过什么了吗?我希望通过对原始数据帧进行一些操作,可以以更直接的方式实现这一点。在
难道没有直接在数据帧上进行元素计算而不是通过numpy数组的操作吗?在
您可以始终使用
df.filter
来选择相关的列名。它可以接受一个正则表达式,这样您就可以用如下方式指定after/before列:关于算术运算,你没有遗漏任何东西。这里有必要使用Numpy数组(
.values
),否则Pandas从两个数据帧中的公共索引标签计算值。如果索引丢失,则NaN
中的计算结果。Numpy数组没有标记索引,因此元素操作成功。在相关问题 更多 >
编程相关推荐