繁体   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