Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫系列可以是一列而不是一行吗?_Python_Pandas - Fatal编程技术网

Python 熊猫系列可以是一列而不是一行吗?

Python 熊猫系列可以是一列而不是一行吗?,python,pandas,Python,Pandas,这是一个真正的问题,尽管乍一看似乎令人毛骨悚然。基本上,我想把一个系列看作一列而不是一行,我认为这是很直观的,即使系列在技术上不能分为行和列(?),而一维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]:

这是一个真正的问题,尽管乍一看似乎令人毛骨悚然。基本上,我想把一个系列看作一列而不是一行,我认为这是很直观的,即使系列在技术上不能分为行和列(?),而一维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(使用“重塑”)中效果很好,因为可以将行和设置为列或行向量。但在这里,我不能重塑序列或在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
索引排列在这里,为什么熊猫在系列/系列广播中使用的索引与在数据帧/系列广播中使用的索引不同?还是我只是觉得这完全错了

试试看

df.iloc[:, 0:3].div(df.rowsum, axis=0)
看看这是不是你想要的。

试试看

df.iloc[:, 0:3].div(df.rowsum, axis=0)
看看这是不是你想要的。

试试看

df.iloc[:, 0:3].div(df.rowsum, axis=0)
看看这是不是你想要的。

试试看

df.iloc[:, 0:3].div(df.rowsum, axis=0)
看看这是不是你想要的。

试试这个

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
如果不需要行和列,可以使用

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

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
如果不需要行和列,可以使用

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

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
如果不需要行和列,可以使用

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

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
如果不需要行和列,可以使用

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

谢谢这是一个很好的实践方法,尽管我仍在寻求更深入的理解。查看帮助和更多细节。谢谢!这是一个很好的实践方法,尽管我仍在寻求更深入的理解。查看帮助和更多细节。谢谢!这是一个很好的实践方法,尽管我仍在寻求更深入的理解。查看帮助和更多细节。谢谢!这是一个很好的实践方法,尽管我仍在寻求更深入的理解。查看帮助和更多细节。谢谢!这可能是最具可读性的方法,不过如果有好的替代方案,出于速度原因,我通常会尽量避免使用apply/lambda(尽管这里不考虑速度)。谢谢!这可能是最具可读性的方法,不过如果有好的替代方案,出于速度原因,我通常会尽量避免使用apply/lambda(尽管这里不考虑速度)。谢谢!这可能是最具可读性的方法,不过如果有好的替代方案,出于速度原因,我通常会尽量避免使用apply/lambda(尽管这里不考虑速度)。谢谢!这可能是最具可读性的方法,不过如果有好的替代方案,出于速度原因,我通常会尽量避免使用apply/lambda(尽管这里不考虑速度)。