我有以下格式的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])
。如何解决此错误以解决我提到的任务?
答案 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)
如果必须定期执行此操作,则可以随时使用此方法进行包装。试试看。