#python #pandas #numpy
#python #pandas #numpy
Вопрос:
Я записываю данные с частотой 2000 Гц, что означает, что каждые 0,5 миллисекунды у меня появляется другая точка данных. Но мое программное обеспечение для записи записывает только с точностью до 1 миллисекунды, так что это означает, что у меня есть повторяющиеся значения в моем индексе фрейма данных, который использует тип float.
Итак, чтобы исправить дубликаты, я хочу добавить 0,005 к каждой другой строке индекса. Я пробовал это, но пока это не работает:
c = df.iloc[:,0] # select the first column of the dataframe
c = c.iloc[::-1] # reverse order so that time is increasing not decreasing
pd.set_option('float_format', '{:f}'.format) # change the print output to show the decimals (instead of 15.55567E9)
i = c.index # get the index of c - the length is 20000
rp = np.matlib.repmat([0, 0.0005], 1, 10000) # create an array to repeat .0005 0 so that we can add 0.005 to every other row
df.set_index(c, i rp).astype(float).applymap('{:,.4f}'.format) # set the index of c to i rp - attempt to format to 4 decimals
print(c) # see if it worked
Ожидаемый результат: (обрезан для экономии места — не отображаются все 20 000 строк)
1555677243.401000 4.569000
1555677243.401500 4.569000
1555677243.402000 4.571000
1555677243.402500 4.574000
1555677243.403000 4.574000
1555677243.403500 4.576000
1555677243.404000 4.577000
1555677243.404500 4.577000
1555677243.405000 4.577000
1555677243.405500 4.581000
1555677243.406000 4.581000
1555677243.406500 4.582000
1555677243.407000 4.581000
1555677243.407500 4.582000
1555677243.408000 4.580000
1555677243.408500 4.580000
1555677243.409000 4.582000
1555677243.409500 4.585000
1555677243.410000 4.585000
1555677243.410500 4.585000
Фактический результат: (обратите внимание на дубликаты в индексе)
1555677243.401000 4.569000
1555677243.401000 4.569000
1555677243.402000 4.571000
1555677243.402000 4.574000
1555677243.403000 4.574000
1555677243.403000 4.576000
1555677243.404000 4.577000
1555677243.404000 4.577000
1555677243.405000 4.577000
1555677243.405000 4.581000
1555677243.406000 4.581000
1555677243.406000 4.582000
1555677243.407000 4.581000
1555677243.407000 4.582000
1555677243.408000 4.580000
1555677243.408000 4.580000
1555677243.409000 4.582000
1555677243.409000 4.585000
1555677243.410000 4.585000
1555677243.410000 4.585000
Комментарии:
1. есть ли конкретная причина не удалять дубликаты, поскольку ваша машина в любом случае имеет точность всего в 1 миллисекунду?
2.
Actual output:
вы вставили выше, из последней строки написано:print(c) # see if it worked
? если да,c
все еще содержит старые значения изc = c.iloc[::-1]
.3. @AndyL. Почему вы так говорите? Значения индекса увеличиваются, тогда как до
c = c.iloc[::-1]
кода их значения уменьшались, поэтому я думаю, что это сработало.4. @aguazul: о, вы меня неправильно поняли. Да,
c = c.iloc[::-1]
работает нормально. Я имею в виду другое. В вашем фрагменте кода последняя строкаprint(c)
. Строки междуc = c.iloc[::-1]
иprint(c)
не изменяютсяc
. Таким образом,print(c)
не будет отражать изменение по промежуточным строкам. Я прошу проверить на всякий случай опечатку. Я сам однажды наткнулся на такого рода опечатку при тестировании 😉5. @AndyL. о, теперь я понимаю вашу точку зрения — ну, я пытался использовать
set_index
атрибут для изменения индексаc
, поэтому я подумал, что эта строка изменяетc
. Но я думаю, что использовал это неправильно. В любом случае, ответ Вен-Бена сработал для меня, так что проблема решена. Спасибо 🙂
Ответ №1:
df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9],
'B': [1,2,3,4,5,6,7,8,9]})
df.iloc[1::2, 1] = df.iloc[1::2, :].eval('B 0.005')
A B
0 1 1.000
1 2 2.005
2 3 3.000
3 4 4.005
4 5 5.000
5 6 6.005
6 7 7.000
7 8 8.005
8 9 9.000
Просто нужно убедиться, что вы выбрали правильный столбец с начальным iloc. [1::2] все остальные начинаются с индекса 1 (так что 1,3 и т.д.). Вам нужно выбрать все столбцы во втором iloc из-за того, что eval работает только с df, а не с series. Затем вы можете установить для этого столбца значение index, как вы делали в своем коде.
Ответ №2:
Данные IIUC из gmds
df.index =np.arange(len(df))%2*0.0005
df
0
0.0000 0
0.0015 1
0.0020 2
0.0035 3
0.0040 4
0.0055 5
0.0060 6
0.0075 7
0.0080 8
0.0095 9
Комментарии:
1. @aguazul yw 🙂 удачного кодирования
Ответ №3:
Вы можете извлечь индекс, преобразовать его в Series
, изменить его и поместить обратно ( Indexes
являются неизменяемыми):
import pandas as pd
df = pd.DataFrame(list(range(10)), index=[x/ 1000 for x in range(10)])
new_index = df.index.to_series()
new_index[::2] = 0.0005
result = df.set_index(new_index)
print(result)
Вывод:
0
0.0005 0
0.0010 1
0.0025 2
0.0030 3
0.0045 4
0.0050 5
0.0065 6
0.0070 7
0.0085 8
0.0090 9
Ответ №4:
У меня нет вашего фрейма данных, но вы можете подумать о создании цикла над четными / нечетными индексами, такими как. вы можете показать нам исходный DF?
data = pd.read_csv('C:/random/d2', sep=',', header=None,names=['W1','W2'])
df=pd.DataFrame(data)
dfNew=pd.DataFrame(columns=['W1','W2'])
rows,clumns=df.shape
for index in range(rows):
if(index %2==0):
tempRow=['{0:.6f}'.format(df.iat[index,0]), df.iat[index,1]]
else:
tempRow=['{0:.6f}'.format(df.iat[index,0] 0.0005), df.iat[index,1]]
dfNew.loc[len(dfNew)]=tempRow
print(df)
print('#############')
print(dfNew)
данные
1555677243.401000,4.569000
1555677243.401000,4.569000
1555677243.402000,4.571000
1555677243.402000,4.574000
1555677243.403000,4.574000
1555677243.403000,4.576000
1555677243.404000,4.577000
1555677243.404000,4.577000
1555677243.405000,4.577000
1555677243.405000,4.581000
1555677243.406000,4.581000
1555677243.406000,4.582000
1555677243.407000,4.581000
1555677243.407000,4.582000
1555677243.408000,4.580000
1555677243.408000,4.580000
1555677243.409000,4.582000
1555677243.409000,4.585000
1555677243.410000,4.585000
1555677243.410000,4.585000
Результат
W1 W2
0 1555677243.401000 4.569
1 1555677243.401500 4.569
2 1555677243.402000 4.571
3 1555677243.402500 4.574
4 1555677243.403000 4.574
5 1555677243.403500 4.576
6 1555677243.404000 4.577
7 1555677243.404500 4.577
8 1555677243.405000 4.577
9 1555677243.405500 4.581
10 1555677243.406000 4.581
11 1555677243.406500 4.582
12 1555677243.407000 4.581
13 1555677243.407500 4.582
14 1555677243.408000 4.580
15 1555677243.408500 4.580
16 1555677243.409000 4.582
17 1555677243.409500 4.585
18 1555677243.410000 4.585
19 1555677243.410500 4.585