Python numpy-列表分配索引超出范围

时间:2019-01-24 11:58:15

标签: python python-3.x pandas csv numpy

我有以下格式的CSV文件

86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10

为了可重复性,我包括了完整的CSV file here。从第1列开始,我想读取当前行并将其与上一行的值进行比较。如果更大,则我要取当前值与前一个值的差,并将差值存储(append)到列表中。如果当前值等于上一行的值,则继续比较。让我说清楚。例如,在我提供的上述示例记录中,第三行(19)大于第二行(15)的值-因此它将是({{ 1}}),第四行(19-15 =4)等

这是我使用52-19 = 33

的简单方法
numpy

但是,我收到错误import numpy as np import pandas as pd import csv df = pd.read_csv("testdata.csv") with open("testdata.csv") as f: reader = csv.reader(f, delimiter=",") for i in reader: print (i[0]) diffs=np.diff(i[0]) increased_value=np.median(diffs[diffs>0]) 。如何解决此错误以解决我提到的任务?

6 个答案:

答案 0 :(得分:4)

我认为这是一种更好的方法

df = pd.read_csv("testdata.csv", header=None)
df
     0     1
0   86     1
1   15     2
2   19     3
3   52     4
4   15     5
5   13     6
6   18     7
7   20     8
8   49     9
9   266   10

diffs = np.diff(df[0])
increased_value = np.median(diffs[diffs>0])
increased_value

17.0

答案 1 :(得分:1)

使用熊猫s.diff()

data = StringIO("""86,1
15,2
19,3
52,4
15,5
13,6
18,7
20,8
49,9
266,10""")

df=pd.read_csv(data,header=None)

m1=df[0].diff().fillna(0)
#m1[m1>0].tolist()
#[4.0, 33.0, 5.0, 2.0, 29.0, 217.0]
m1[m1>0].median()
#17.0

答案 2 :(得分:0)

基本上,np.diff()需要一个类似于输入的列表,并且您要传递的是一个整数。这就是失败的原因

答案 3 :(得分:0)

从技术上讲,我们不需要numpy

from statistics import median
from operator import itemgetter, lt, sub

first = itemgetter(0)
nums = []

with open('testdata.csv', 'r') as fin:
    reader = csv.reader(fin)
    for line in reader:
        nums.append(int(first(line)))

res = [abs(sub(*t)) for t in zip(nums, nums[1:]) if lt(*t)]

[4, 33, 5, 2, 29, 217]

median(res)

17.0

答案 4 :(得分:0)

得到的原因

  

IndexError:列表分配索引超出范围

np.diff()接受数组或列表之类的输入。

喜欢

arr = []
df = pd.read_csv("testdata3.csv")
df
with open("testdata3.csv", mode='r', encoding='utf-8-sig') as f:
    reader = csv.reader(f, delimiter=",")
    for i in reader:
#         print(i[0])
        arr.append(int(i[0]))

diffs=abs(np.diff(arr))
increased_value=np.median(diffs[diffs>0])

答案 5 :(得分:0)

您遇到的问题是尝试运行np.diff时,数组的默认dtype是dtype U3,这意味着数组中的值不是数字,这意味着需要进行转换。请尝试以下操作:

with open("test_data.csv", "r") as f:
    reader = csv.reader(f) ## no need for delimiter if your delimiter is ','
    data = []
    for row in reader:
        data.append(row[0])

## ensure that you convert your data into numpy array with appropriate data type 
## before carrying out any mathematical operations 

np_array = np.array(data, dtype=np.uint8) 
np_diff = np.diff(np_array)
np_median = abs(np.median(np_diff[np_diff > 0]))

print(np_median)

如果必须定期执行此操作,则可以随时使用此方法进行包装。试试看。