[英]Python pandas, multiplication of specific series of data
想象一下,我打開2個.csv
文件,使2個數組包含與不同類型的對象相關的不同類型的數據。
一個是對象列表:
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
我的函數將object-type
函數中的measurement
乘以H2O_percent
首先讓我們這段代碼:
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'])
區分對象的類型的首選語法是什么?
換句話說,如何翻譯此偽代碼:
對於所有貓,進行測量*如文件/列表“ H2O_percentage.csv”中所述H20_percent
編輯:
第二個問題:序列號在這里告訴我“ 1表示第一次測量,2表示第二次測量,依此類推。”
我如何分別計算所有單個測量值(假設有成百上千個“ em ...”)?
謝謝
嘗試這個:
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
關於第二個問題:您是否要根據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]
在這里,res [res ['serialNumber'] == 1]僅允許您選擇serialNumber == 1的行索引。現在,您可以根據serialNumber中的值進行單獨的計算。 如果“ measurement_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函數類似於內置於“ map”中的python。 您可以在行或列上“應用”相同的函數(其中axis = 1表示行方向[自上而下],其中索引將是列名,而axis = 0則表示行方向[左至右]行索引是索引)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.