Как добавить значение в индекс с плавающей запятой для кадра данных для каждой второй строки? - PullRequest
6 голосов
/ 25 апреля 2019

Я записываю данные с частотой 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

Ответы [ 4 ]

2 голосов
/ 25 апреля 2019
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, а не с сериями.Затем вы можете установить для этого столбца индекс, как в коде.

1 голос
/ 25 апреля 2019

Данные 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 голос
/ 25 апреля 2019

Вы можете извлечь индекс, преобразовать его в 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
1 голос
/ 25 апреля 2019

У меня нет вашего фрейма данных, но вы можете подумать о создании цикла для четных / нечетных индексов, таких как. Вы можете показать нам оригинальный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...