2014-01-29 4 views
0

Представьте, что я открываю 2 .csv файлы для создания 2 массивов, содержащих разные типы данных, относящихся к различным типам объектов.Pandon pandas, умножение конкретных рядов данных

Один список объектов:

object_type measurement name serialNumber 
cat   6.3   bill 1 
cat   7.1   kitty 1 
whale  25678  none 1 
dog   11.1   none 1 
dolphin  200.8  none 1 
cat   6.1   bill 2 
cat   7   kitty 2 
whale  25121  none 2 
dog   12.1   none 2 
dolphin  200   none 2 

Другой говорит мне процент воды в организме нескольких животных:

object-type H2O_percent 
dog   66 
cat   66 
whale  75 
dolphin  75 
jellyfish 98 

моя функция будет умножать measurement на H2O_percent в функция от object-type

Давайте сперва этот код:

import pandas as pd 

object_list = pd.read_csv('animals.csv', names=['object_type', 'measurement', 'name', 'serialNumber']) 
percentages = pd.read_csv('H2O_percentage.csv', names=['wavelength', 'a', 'b']) 

Каков предпочтительный синтаксис для различения объектов в зависимости от их типа?

Другими словами, как перевести этот псевдокод:

для всех кошек, делать измерение * H20_percent, как указано в файле/список 'H2O_percentage.csv'

EDIT:

2-й вопрос: serial_number здесь, чтобы сказать мне "1 означает первый mea уверенность, 2 второе измерение и т. д. "

Как я могу вычислить отдельно все индивидуальные измерения (представьте, что их сотни?)?

Благодаря

+0

Какой результат вы ожидаете от «вычислять отдельно все индивидуальные измерения» –

ответ

1

Попробуйте это:

res = pd.merge(object_list,percentages,left_on='object_type',right_on='object-type') 
res['water'] = res['measurement'] * res['H2O_percent'] 

Не уверен, что вы хотите в вашем втором вопросе, но вы можете попробовать это и посмотреть, если это помогает:

for i,g in res.groupby(['object_type','name']): 
    print "="*80 
    print g 
    print "="*80 
+0

спасибо, не могли бы вы проверить второй вопрос, проблема стала более понятной ... –

0

В отношении на второй вопрос: Вы пытаетесь применить два разных типа уравнений на основе значения в serialNumber?

После слияния между object_list и процентами вы можете «запросить» фрейм данных на основе значения в serialNumber и применить правильную формулу;

# object_list columns -> ['object-type','measurement','name','serialNumber'] 
# percentages columns -> ['object-type','H2O_percent'] 

# Merge the two dataframe on object-type and save the result as res 
res = pd.merge(object_list,percentages,how='inner',on=['object_type']) 
# res columns -> ['object-type','measurement','name','serialNumber','H2O_percent'] 

# Create a new column for the results and default it to 0.0 
res['water'] = 0.0 
# For all rows that have serialNumber equal to 1 -- do calculations 
res['water'][res['serialNumber'] == 1] = \ 
        res['measurement'][res['serialNumber'] == 1] * \ 
        res['H2O_percent'][res['serialNumber'] == 1] 
# For all rows that have serialNumber equal to 2 -- do calculations 
res['water'][res['serialNumber'] == 2] = \ 
        res['measurement'][res['serialNumber'] == 2] * \ 
        res['H2O_percent'][res['serialNumber'] == 2] 

Здесь Рез [Рез [ «SERIALNUMBER»] == 1] позволит вам выбрать только строки индексов, где SERIALNUMBER == 1. Теперь с этой идеей, вы можете сделать отдельный расчет на основе значения в серийный номер. Если для «measure_1» и «measurement_2» будут разные столбцы, вы можете просто изменить имя столбца, которое нужно умножить на.

Кроме того, если вы будете применять то же вычисление, но только изменяете столбец измерения на основе серийного номера, и ваши имена столбцов в object_list, как:

['object-type','measurement_1','measurement_2','name','serialNumber'] 

Если порядковый номер соответствует измерению столбца, то вы также можете сделать что-то вроде этого:

res['water'] = res.apply(axis=1, func=lambda x: x["measurement_%i"%(x['serialNumber'])] * x["H2O_percent"]) 

Функция apply аналогична встроенной в «pythons». Вы можете «применить» ту же функцию по строкам или столбцам (где axis = 1 для строки [сверху вниз], где индексы будут именами столбцов, а ось = 0 по столбцам [слева направо] где индексы строк являются индексами)

Смежные вопросы