Обратите внимание, что pd.read_csv()
выдаст ошибку при чтении CSV с переменным числом столбцов, если вы заранее не укажете имена столбцов. Это должно сделать это:
import pandas as pd
import numpy as np
df = pd.read_csv('sample.txt', names=['Index','Date','Val1','Val2','Val3','Val4'], sep='|')
df[df[['Val1','Val2','Val3','Val4']]>2] = np.nan
df['Final'] = df.iloc[:,2:].sum(axis=1)
df = df[['Index','Date','Final']]
Дает:
Index Date Final
0 323 2013-06-03 00:00:00 0.0
1 323 2013-06-03 01:00:00 1.0
2 323 2013-06-03 02:00:00 1.5
3 323 2013-06-03 03:00:00 1.5
4 323 2013-06-03 04:00:00 0.0
5 323 2013-06-03 05:00:00 0.5
6 323 2013-06-03 06:00:00 0.0
7 323 2013-06-03 07:00:00 3.5
8 323 2013-06-03 08:00:00 0.5
Вот более краткий подход (он очень похож на ответ @Scott Boston ниже, но избегает создания отдельного фрейма данных). Установка первых двух столбцов вашего csv в качестве индексов вашего информационного кадра позволяет вам условно фильтровать оставшуюся часть вашего информационного кадра, которая содержит только значения с плавающей запятой:
df = pd.read_csv('sample.txt', names=['Index','Date','Val1','Val2','Val3','Val4'], sep='|').set_index(['Index','Date'])
df['Final'] = df[(df>0) & (df<=2)].sum(axis=1)
df.reset_index()[['Index','Date','Final']].to_csv('output.csv', index=False, header=False)
Дает:
323,2013-06-03 00:00:00,0.0
323,2013-06-03 01:00:00,1.0
323,2013-06-03 02:00:00,1.5
323,2013-06-03 03:00:00,1.5
323,2013-06-03 04:00:00,0.0
323,2013-06-03 05:00:00,0.5
323,2013-06-03 06:00:00,0.0
323,2013-06-03 07:00:00,3.5
323,2013-06-03 08:00:00,0.5