想象一下,我打开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
我的函数会在函数中将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'])
根据类型区分对象的首选语法是什么?
换句话说,如何翻译这个伪代码:
对于所有猫,按照文件/列表'H2O_percentage.csv'中的说明进行测量* H20_percent
编辑:
第二个问题:serial_number告诉我“1表示第一次测量,2表示次级测量,等等。”
如何单独计算所有单个测量值(想象有数百个'em ...)?
由于
答案 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
答案 1 :(得分: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]
这里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”的pythons。您可以在行或列上“应用”相同的函数(其中axis = 1用于行[从上到下],其中索引将是列名称,而axis = 0是按列[从左到右]其中行索引是索引)