大熊猫系列可以是一列而不是一排吗?

时间:2014-08-21 03:03:18

标签: python pandas

这是一个真正的问题,虽然乍一看似乎是分裂的。基本上我想将一个系列视为一列而不是一行,我认为即使系列在技术上不能分为行和列(?)而且1d numpy数组也可以。例子:

df = pd.DataFrame( { 'a' : [5,3,1],
                     'b' : [4,6,2],
                     'c' : [2,4,9] } )

df['rowsum'] = df.sum(1)

In [31]: df
Out[31]: 
   a  b  c  rowsum
0  5  4  2      11
1  3  6  4      13
2  1  2  9      12

我只想按行获取百分比(所以行总和为1)。我想这样做:

df.iloc[:,0:3] / df.rowsum

在numpy(使用reshape)中工作正常,因为你可以使rowum成为列或行向量。但在这里我不能重塑该系列或在df.rowsum上使用T.似乎数据帧可以转置而不是一系列。以下工作(以及其他几个解决方案)。它可以在numpy中自然编码,但这涉及转换为数组然后再转换回数据帧。

In [32]: ( df.iloc[:,0:3].T / df.rowsum ).T
Out[32]: 
          a         b         c
0  0.454545  0.363636  0.181818
1  0.230769  0.461538  0.307692
2  0.083333  0.166667  0.750000

对不起,如果这看起来微不足道,但能够以直观的方式对行和列进行编码是很有价值的。所以问题仅仅是:我可以使一系列行为像列向量而不是行向量吗?

这似乎不一致,这将在列上正常工作。

df.iloc[:,0] / df.rowsum

在这种情况下,pandas将分割(元素方向)两个列数组(由于显示,即使行/列区别是人为的)。但是当该表达式的第一部分从数据帧更改为系列时,它似乎有效地从3x1变为1x2。从一系列到数据帧是一种隐式变换操作吗?

也许更好的方式来考虑它:

all( dist.iloc[:,:10].index == dist.rowsum.index )
Out[1526]: True

索引排在这里,为什么pandas似乎对系列/系列广播采用不同于数据帧/系列广播的索引?或者我只是想这完全错了?!?

2 个答案:

答案 0 :(得分:2)

试试这个

df.apply(lambda x:x/x[3], axis = 1)

        a          b           c    rowsum
0   0.454545    0.363636    0.181818    1
1   0.230769    0.461538    0.307692    1
2   0.083333    0.166667    0.750000    1

如果您不需要rowsum列,可以使用

df.apply(lambda x:x/sum(x), axis = 1) #with your original dataFrame

答案 1 :(得分:1)

尝试

df.iloc[:, 0:3].div(df.rowsum, axis=0)

看看它是不是你想要的。