len()的行为与范围()

时间:2015-08-24 19:16:39

标签: python pandas

使用此数据框,dff:

   A  B
0  0  a
1  1  a
2  2  b
3  3  b
4  4  b
5  5  b
6  6  c
7  7  c

我理解len(dff) == 8

的方式

但是,我不明白答案:

dff['counts'] = np.arange(len(dff)) 

     A  B  counts  
  0  0  a       0  
  1  1  a       1  
  2  2  b       2  
  3  3  b       3  
  4  4  b       4  
  5  5  b       5  
  6  6  c       6  
  7  7  c       7  

每行dff['counts']不应该是8吗?引擎盖下发生了什么?

1 个答案:

答案 0 :(得分:2)

您似乎误解了np.arange的作用:

In [32]:

np.arange(8) 
Out[32]:
array([0, 1, 2, 3, 4, 5, 6, 7])

此处df的长度用于设置stop参数:

来自文档:

numpy.arange([start, ]stop, [step, ]dtype=None)
Return evenly spaced values within a given interval.

Values are generated within the half-open interval [start, stop) (in other words, the interval including start but excluding stop). For integer arguments the function is equivalent to the Python built-in range function, but returns an ndarray rather than a list.

When using a non-integer step, such as 0.1, the results will often not be consistent. It is better to use linspace for these cases.

Parameters: 
start : number, optional
Start of interval. The interval includes this value. The default start value is 0.
stop : number
End of interval. The interval does not include this value, except in some cases where step is not an integer and floating point round-off affects the length of out.
step : number, optional
Spacing between values. For any output out, this is the distance between two adjacent values, out[i+1] - out[i]. The default step size is 1. If step is specified, start must also be given.
dtype : dtype
The type of the output array. If dtype is not given, infer the data type from the other input arguments.
Returns:    
arange : ndarray
Array of evenly spaced values.
For floating point arguments, the length of the result is ceil((stop - start)/step). Because of floating point overflow, this rule may result in the last element of out being greater than stop.

如果你想将每一行设置为相同的值,那么

In [34]:

dff['counts'] = len(dff)
dff
Out[34]:
   A  B  counts
0  0  a       8
1  1  a       8
2  2  b       8
3  3  b       8
4  4  b       8
5  5  b       8
6  6  c       8
7  7  c       8