繁体   English   中英

Python:如何在数据框中传递3列作为函数中的3个独立参数并迭代列值

[英]Python: how to pass 3 columns in data frame as 3 separate arguments in function and iterate through the column values

我有下面列出的列的python数据框:这个数据框存储到变量WSI_Hourly

Date    Rain (in)            
1/5     2           
1/6     0          
1/7     7   
1/8     10    
1/9     13   
1/10    11   
1/11    1   

我正在尝试编写一个函数来创建一个新列,指定“Rain”值所属的动态范围桶。 请参阅所需的输出表

Date   Rain     Rain_Range    
1/5    2        0-5 inches
1/6    0        0-5 inches
1/7    7        6-10 inches
1/8    10       6-10 inches
1/9    13       11-15 inches
1/10   11       11-15 inches
1/11   1        0-5 inches 

以下是我的功能:

def precip(df, min_value, max_value, desc):
    if(min_value < max_value):
        for i, m in df.iterrows():
            if (m['Rain'] >= min_value) & (m['Rain'] <= max_value):
                df.set_value(i, 'Rain_Range', desc)

precip(WSI_Hourly, min_value, max_value, desc)

因为我想动态设置'Rain_Range'值是什么,我想通过表示min_value,max_value和desc参数的函数传递以下数据帧。

请参阅下面的数据框表:

min_value   max_value   desc      
0           5           0-5 inches   
6           10          6-10 inches    
11          15          11-15 inches

我的问题是:如何将上面数据框中的min_value,max_value和desc列传递给我的函数作为获取所需输出表的参数

*非常感谢任何帮助

如果我理解你在寻找什么,你需要zip功能。

def f(x,y,z):
    for a,b,c in zip(x,y,z):
        print(a,b,c)

x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
z = [100, 200, 300, 400]

f(x,y,z)

数据作为数据列传递, zip函数同时迭代所有三列,返回一个可迭代的元组,您可以将其解压缩为for循环的循环索引。

正如@jeremycg在评论中建议的那样,使用pd.cut()

pd.cut(df["Rain"], 
       [-0.001, 5, 10, 15], # Bin boundaries
       labels=["0-5 inches", "6-10 inches", "11-15 inches"] # Bin labels
      )

# Result:
# 0      0-5 inches
# 1      0-5 inches
# 2     6-10 inches
# 3     6-10 inches
# 4    11-15 inches
# 5    11-15 inches
# 6      0-5 inches
# Name: Rain, dtype: category
# Categories (3, object): [0-5 inches < 6-10 inches < 11-15 inches]

您可以使用pd.cut跳过您的功能。

一些数据:

from io import StringIO

import pandas as pd

dat=StringIO('''Date    Rain(in)            
1/5     2           
1/6     0          
1/7     7   
1/8     10    
1/9     13   
1/10    11   
1/11    1   ''')

cuts = StringIO('''min_value   max_value   desc      
0           5           0-5inches   
6           10          6-10inches    
11          15          11-15inches''')
df = pd.read_csv(dat, delim_whitespace = True)
cuts = pd.read_csv(cuts, delim_whitespace = True)

现在我们使用pd.cut函数'切割',使用“剪切”数据框中的区域和标签:

df['Rain_Range'] = pd.cut(df['Rain(in)'],\
        bins = pd.concat([cuts.min_value[:1]-1,cuts.max_value]),\
        labels = cuts.desc)

这使:

Date    Rain(in)    Rain_Range
1/5     2   0-5inches
1/6     0   0-5inches
1/7     7   6-10inches
1/8     10  6-10inches
1/9     13  11-15inches
1/10    11  11-15inches
1/11    1   0-5inches

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM