簡體   English   中英

Python熊貓,特定系列數據的乘法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM