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