首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何迭代多个函数参数?

如何迭代多个函数参数?
EN

Stack Overflow用户
提问于 2020-02-04 18:53:18
回答 2查看 127关注 0票数 2

我试图使用局部变量()或*args来迭代多个函数参数。但是,我将函数参数定义为来自dataframe的列。如何编辑以下内容,使float_format函数对可变数量的参数进行迭代?

代码语言:javascript
复制
#! /usr/bin/env python3

import pandas as pd

def float_format(a, b, c, d, e, f): #Change to single *args function argument?
        for x in range(len(data[a])):
                data[a][x] = data[a][x].replace(' Mbps', '')
        for x in range(len(data[b])):
                data[b][x] = data[b][x].replace(' Mbps', '')
        for x in range(len(data[c])):
                data[c][x] = data[c][x].replace(' Mbps', '')                
        for x in range(len(data[d])):
                data[d][x] = data[d][x].replace(' Mbps', '')
        for x in range(len(data[e])):
                data[e][x] = data[e][x].replace(' Mbps', '')
        for x in range(len(data[f])):
                data[f][x] = data[f][x].replace(' Mbps', '')

file = r'Original_File.xls'
data = pd.read_excel(file, header=[2])

float_format('Average Receive bps',
               'Peak Receive bps',
               'Received Bandwidth',
               'Average Transmit bps',
               'Peak Transmit bps',
               'Transmit Bandwidth')

data.to_excel('results.xlsx', 'w+')

所以如果我尝试

代码语言:javascript
复制
def float_format(*iterate):
        for arg in iterate:
            for x in range(len(data[iterate])):
                    data[iterate][x] = data[iterate][x].replace(' Mbps', '')

在函数的运行方式上,我得到了跟踪错误。

示例df

代码语言:javascript
复制
>>> data
            Display Name Interface Name  ... Peak Transmit bps Transmit Bandwidth
0       1951 - LAB - FW1          port1  ...         0.56 Mbps         10.00 Mbps
1       1951 - LAB - FW1          port1  ...         0.37 Mbps         10.00 Mbps
2       1951 - LAB - FW1          port1  ...         0.34 Mbps         10.00 Mbps
3       1951 - LAB - FW1          port1  ...         0.36 Mbps         10.00 Mbps
4       1951 - LAB - FW1          port1  ...         0.83 Mbps         10.00 Mbps
5       1951 - LAB - FW1          port1  ...         0.55 Mbps         10.00 Mbps
6       1951 - LAB - FW1          port1  ...         0.27 Mbps         10.00 Mbps
7       1951 - LAB - FW1          port1  ...         0.41 Mbps         10.00 Mbps
8       1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
9       1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
10      1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
11      1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
12      1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
13      1951 - LAB - FW1          port2  ...         0.00 Mbps       1000.00 Mbps
14      1951 - LAB - FW1          port2  ...         0.19 Mbps       1000.00 Mbps
15      1951 - LAB - FW1          port2  ...         0.31 Mbps       1000.00 Mbps
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 20:52:27

这里没有必要使用*args或类似的东西,我们可以利用Pandas提供的操作。

设置代码

代码语言:javascript
复制
import numpy as np
import pandas as pd

df_1 = pd.DataFrame(data={'col_1': np.random.randint(0, 10, 10),
                          'col_2': np.random.randint(0, 50, 10),
                          'col_3': np.random.randint(0, 5, 10)})

df_1[['col_1', 'col_3']] = df_1[['col_1', 'col_3']].astype(str) + ' Mbps'

print(df_1)
print(df_1.dtypes)

输出:

代码语言:javascript
复制
    col_1  col_2   col_3
0  1 Mbps     45  0 Mbps
1  2 Mbps     34  1 Mbps
2  6 Mbps     46  2 Mbps
3  7 Mbps      2  1 Mbps
4  6 Mbps     36  0 Mbps
5  9 Mbps     36  3 Mbps
6  4 Mbps     39  1 Mbps
7  4 Mbps     26  1 Mbps
8  1 Mbps     10  1 Mbps
9  6 Mbps      1  1 Mbps
col_1    object
col_2     int64
col_3    object
dtype: object

方法1:Series.str.extract()

使用循环

代码语言:javascript
复制
cols_to_change = ['col_1', 'col_3']

for col_name in cols_to_change:
    df_1[col_name] = df_1[col_name].str.extract(r"(\d+) Mbps", expand=False).astype(int)

使用DataFrame.apply()

代码语言:javascript
复制
cols_to_change = ['col_1', 'col_3']

df_1[cols_to_change] = df_1[cols_to_change].apply(lambda col: col.str.extract(r"(\d+) Mbps", expand=False)).astype(int)

方法2:Series.str.slice()

使用循环

代码语言:javascript
复制
cols_to_change = ['col_1', 'col_3']

for col_name in cols_to_change:
    df_1[col_name] = df_1[col_name].str.slice(stop=-5).astype(int)

使用DataFrame.apply()

代码语言:javascript
复制
cols_to_change = ['col_1', 'col_3']

df_1[cols_to_change] = df_1[cols_to_change].apply(lambda col: col.str.slice(stop=-5)).astype(int)

结果

DataFrame内容:

代码语言:javascript
复制
   col_1  col_2  col_3
0      9     40      3
1      4      8      3
2      6     49      4
3      4     38      4
4      6     25      4
5      3      8      3
6      3     27      3
7      0     45      1
8      7     24      4
9      3     29      2

dtypes

代码语言:javascript
复制
col_1    int64
col_2    int64
col_3    int64
dtype: object

如果你有任何问题,请告诉我:)

票数 1
EN

Stack Overflow用户

发布于 2020-02-04 18:57:52

下面这个怎么样?

代码语言:javascript
复制
def test(*argv):
    for arg in argv:
            print(arg)

test('hello', 'world')
# hello
# world
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60063867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档