Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用.ix和.isin循环遍历文件_Python 2.7_Loops_Pandas - Fatal编程技术网

Python 2.7 使用.ix和.isin循环遍历文件

Python 2.7 使用.ix和.isin循环遍历文件,python-2.7,loops,pandas,Python 2.7,Loops,Pandas,我的原始数据如下所示: SUBBASIN HRU HRU_SLP OV_N 1 1 0.016155144 0.15 1 2 0.015563287 0.14 2 1 0.010589782 0.15 2 2 0.011574839 0.14 3 1 0.013865396 0.15 3 2 0.01744597 0.15 3 3 0.018983217 0.14 3

我的原始数据如下所示:

SUBBASIN HRU HRU_SLP    OV_N
1         1 0.016155144 0.15
1         2 0.015563287 0.14
2         1 0.010589782 0.15
2         2 0.011574839 0.14
3         1 0.013865396 0.15
3         2 0.01744597  0.15
3         3 0.018983217 0.14
3         4 0.013890315 0.05
3         5 0.011792533 0.05
我需要修改每个子正弦数的OV_N值:

hru = pd.read_csv('hru.csv')
for i in hru.OV_N:
    hru.ix[hru.SUBBASIN.isin([76,65,64,72,81,84,60,46,37,1,2]), 'OV_N'] = i*(1+df21.value[12])
    hru.ix[hru.SUBBASIN.isin([80,74,75,66,55,53,57,63,61,41,38,27,26,45,40,34,35,31,33,21,20,17,18,19,23,14,13,8,7,11,6,4,3,5,12]), 'OV_N'] = i*(1+df23.value[12])
    hru.ix[hru.SUBBASIN.isin([85,58,78,54,59,51,52,30,28,16,15,77,79,71,70,86,73,68,69,56,67,62,82,87,83,91,89,90,43,36,39,47,32,49,42,48,50,49,29,22,24,25,9,10]), 'OV_N'] = i*(1+df56.value[12])
    hru.ix[hru.SUBBASIN.isin([92,88,95,94,93]), 'OV_N'] = i*(1+df58.value[12])
其中df21.value[12]是来自txt文件的值
该代码导致所有子系统的OV_N值为无穷大,因此我假设在一个文件中循环多次,但我找不到错误,并且该代码以前使用过不同数量的子系统。

通常最好不要在数据帧中的行上循环和索引。按列操作转换数据帧是更为泛化的方法。熊猫数据帧可以被认为是熊猫系列的压缩组合:每一列都是它自己的熊猫系列——都共享相同的索引。操作可应用于一个或多个系列,以创建共享相同索引的新系列。还可以应用操作将序列与一维numpy数组组合以创建新序列。理解这一点很有帮助,但是这个答案将只使用顺序整数索引

要修改每个子正弦编号的OV_N值:
通过从hru.csv中读取hru数据帧,初始化hru数据帧,如原始问题所示。这里我们用问题中给出的数据初始化它

import numpy as np
import pandas as pd

hru = pd.DataFrame({
    'SUBBASIN':[1,1,2,2,3,3,3,3,3],
    'HRU':[1,2,1,2,1,2,3,4,5],
    'HRU_SLP':[0.016155144,0.015563287,0.010589782,0.011574839,0.013865396,0.01744597,0.018983217,0.013890315,0.011792533],
    'OV_N':[0.15,0.14,0.15,0.14,0.15,0.15,0.14,0.05,0.05]})
创建一个单独的pandas系列,该系列收集并存储来自不同数据帧(即df21、df23、df56和df58)的所有值。这将用于按索引查找值。让我们称之为子乘子。让我们分别假设从txt文件中读取值21、23、56和58。请用从txt文件中读取的实际值替换这些值

subbasin_multiplier_ds=pd.Series([21]*96)
subbasin_multiplier_ds[80,74,75,66,55,53,57,63,61,41,38,27,26,45,40,
    34,35,31,33,21,20,17,18,19,23,14,13,8,7,11,6,4,3,5,12] = 23
subbasin_multiplier_ds[85,58,78,54,59,51,52,30,28,16,15,77,79,71,70,
    86,73,68,69,56,67,62,82,87,83,91,89,90,43,36,39,47,32,49,42,48,50,
    49,29,22,24,25,9,10] = 56
subbasin_multiplier_ds[92,88,95,94,93] = 58
根据数据帧中的列替换hru数据帧中的OV_N,并按索引查找子帧中的乘法器

hru['OV_N'] =  hru['OV_N'] * (1 + subbasin_multiplier_ds[hru['SUBBASIN']].values)

numpy数组是由.值创建的,因此可以获得预期的结果。如果您想尝试删除值,请尝试看看会发生什么。

谢谢您的回答SpeedCoder5。我只需要澄清一件事。在以下行中:subbasin\u multiplier\u ds=pd.Series([21]*96),我应该在括号中放什么?正如我所理解的,你的意思是我需要把我的值乘以每个子正弦数?[21]*96不是乘法,而是一种python方式,它声明一个列表96个项目,所有项目都初始化为21。subbasin_multipiler_ds值每个都包含每个数据帧df21、df23等的txt文件的值[12]中的内容。原始问题在.isin检查中有96项。但是,如果有无限多个,则可能需要一个算法而不是一个序列来进行查找。如果答案回答了问题,请按此做标记。