2016-12-31 5 views
2

Извините, если это было задано раньше - я не мог найти этот конкретный вопрос.python вычитает каждый четный столбец из предыдущего нечетного столбца

В Python, я хотел бы, чтобы вычесть каждый четный столбец из предыдущего нечетного столбца:

так идут от:

292.087 190.238 299.837 189.488 255.525 187.012 
300.837 190.887 299.4 188.488 248.637 187.363 
292.212 191.6 299.038 188.988 249.65 187.5 
300.15 192.4 307.812 189.125 247.825 188.113 

в

101.849 110.349 68.513 
109.95 110.912 61.274 
100.612 110.05 62.15 
107.75 118.687 59.712 

Там будет неизвестно Число столбцов. следует использовать что-то в pandas или numpy?

Заранее спасибо.

+0

Как представляются данные? Вы используете NumPy? Панды? Список списков? – user2357112

+0

Это не структура данных python. Это CSV? – roganjosh

+0

Да, это будет импортировано в python из файла CSV. – BioProg

ответ

2

Вы можете выполнить это с помощью панд. Вы можете выбрать столбцы с четным и нечетным индексом отдельно, а затем вычесть их.

@hiro главный герой, я не знал, что вы можете сделать это магию StringIO. Это пряный.

import pandas as pd 
import io 

data = io.StringIO('''ROI121 ROI122 ROI124 ROI125 ROI126 ROI127 
         292.087 190.238 299.837 189.488 255.525 187.012 
         300.837 190.887 299.4 188.488 248.637 187.363 
         292.212 191.6 299.038 188.988 249.65 187.5 
         300.15 192.4 307.812 189.125 247.825 188.113''') 

df = pd.read_csv(data, sep='\s+') 

Обратите внимание, что даже/нечетные члены могут быть противоречит здравому смыслу, потому что питон 0 индексированные, а это означает, что столбцы сигналов на самом деле даже индексированные и фоновые столбцы нечетно-индексированных. Если я правильно понимаю ваш вопрос, это противоречит использованию четной/нечетной терминологии. Просто указывая на разницу, чтобы избежать путаницы.

# strip the columns into their appropriate signal or background groups 
bg_df = df.iloc[:, [i for i in range(len(df.columns)) if i%2 == 1]] 
signal_df = df.iloc[:, [i for i in range(len(df.columns)) if i%2 == 0]] 

# subtract the values of the data frames and store the results in a new data frame 
result_df = pd.DataFrame(signal_df.values - bg_df.values) 

result_df содержит столбцы, которые разность между сигналом и фоновых столбцов. Вы, вероятно, захотите переименовать эти имена столбцов.

>>> result_df 
     0  1  2 
0 101.849 110.349 68.513 
1 109.950 110.912 61.274 
2 100.612 110.050 62.150 
3 107.750 118.687 59.712 
+0

yep, я нахожу подделку такого файла, который полезен для ответов SO. как ваша версия панды! +1 –

2
import io 

# faking the data file 
data = io.StringIO('''ROI121 ROI122 ROI124 ROI125 ROI126 ROI127 
292.087 190.238 299.837 189.488 255.525 187.012 
300.837 190.887 299.4 188.488 248.637 187.363 
292.212 191.6 299.038 188.988 249.65 187.5 
300.15 192.4 307.812 189.125 247.825 188.113''') 

header = next(data) # read the first line from data 
# print(header[:-1]) 
for line in data: 
    # print(line) 
    floats = [float(val) for val in line.split()] # create a list of floats 
    for prev, cur in zip(floats[::2], floats[1::2]): 
     print('{:6.3f}'.format(prev-cur), end=' ') 
    print() 

с выходом:

101.849 110.349 68.513 
109.950 110.912 61.274 
100.612 110.050 62.150 
107.750 118.687 59.712 

, если вы знаете, что data[start:stop:step] средства и как zip работы это должно быть легко понять.