创建一个通过DataFrame进行迭代的函数

时间:2018-10-01 14:39:03

标签: python pandas dataframe

我遇到一个创建函数的问题,该函数将识别列中的特定值是否在两个值之间。

def bid(x):
if df['tla'] < 85000:
    return 1
elif (df['tla'] >= 85000) & (df['tla'] < 110000):
    return 2
elif (df['tla'] >= 111000) & (df['tla'] < 126000):
    return 3
elif (df['tla'] >= 126000) & (df['tla'] < 150000):
    return 4
elif (df['tla'] >= 150000) & (df['tla'] < 175000):
    return 5
elif (df['tla'] >= 175000) & (df['tla'] < 200000):
    return 6
elif (df['tla'] >= 200000) & (df['tla'] < 250000):
    return 7
elif (df['tla'] >= 250000) & (df['tla'] < 300000):
    return 8
elif (df['tla'] >= 300000) & (df['tla'] < 375000):
    return 9
elif (df['tla'] >= 375000) & (df['tla'] < 453100):
    return 10
elif df['tla'] >= 453100:
    return 11

我将其应用于新列:

df['bid_bucket'] = df['bid_bucket'].apply(bid)

我又收到此错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

有人有什么想法吗?

5 个答案:

答案 0 :(得分:3)

使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul id="ulId"> <div> <div> <li class="cModel active" style=""><a href="#">4RUNNER</a></li> <li class="cModel" style=""><a href="#">86</a></li> <li class="cModel" style=""><a href="#">AVALON</a></li> </div> </div> </ul>

尝试以下操作
numpy.select

答案 1 :(得分:2)

您只需使用 np.digitize 函数来分配范围

df['bid_bucket'] = np.digitize(df['bid_bucket'],np.arange(85000,453100,25000))

示例

a = np.random.randint(85000,400000,10)
#array([305628, 134122, 371486, 119856, 321423, 346906, 319321, 165714,360896, 206404])
bins=[-np.inf, 85000, 110000, 126000, 150000, 175000,
             200000, 250000, 300000, 375000, 453100, np.inf]
np.digitize(a,bins)

出局:

array([9, 4, 9, 3, 9, 9, 9, 5, 9, 7])

答案 2 :(得分:2)

已经可以通过pd.cut,定义垃圾箱边缘并在标签上添加+1来使编号从1开始的方式来实现。

import pandas as pd
import numpy as np
df = pd.DataFrame({'tla': [7, 85000, 111000, 88888, 51515151]})

df['bid_bucket'] = pd.cut(df.tla, right=False,
                          bins=[-np.inf, 85000, 110000, 126000, 150000, 175000,
                                200000, 250000, 300000, 375000, 453100, np.inf], 
                          labels=False)+1

输出:df

        tla  bid_bucket
0         7           1
1     85000           2
2    111000           3
3     88888           2
4    126000           4
5  51515151          11

答案 3 :(得分:1)

要将其保留在大熊猫中:我认为在函数中引用df ['tla']意味着引用系列而不是单个值,这会导致歧义。您应该提供特定的值。您可以使用lambda x,那么您的代码可能是这样的

df = pd.DataFrame({'tla':[10,123456,999999]})

def bid(x):
    if x < 85000:
        return 1
    elif (x >= 85000 and x < 110000):
        return 2
    elif (x >= 111000 and x < 126000):
        return 3
    elif (x >= 126000 and x < 150000):
        return 4
    elif (x >= 150000 and x < 175000):
        return 5
    elif (x >= 175000 and x < 200000):
        return 6
    elif (x >= 200000 and x < 250000):
        return 7
    elif (x >= 250000 and x < 300000):
        return 8
    elif (x >= 300000 and x < 375000):
        return 9
    elif (x >= 375000 and x < 453100):
        return 10
    elif x >= 453100:
        return 11

df['bid_bucket'] = df['tla'].apply(lambda x: bid(x))
df

答案 4 :(得分:1)

您有两种可能。 可以按行方式在pandas DataFrame的行上应用定义的函数:

def function_on_a_row(row):
  if row.tla > ...
    ...

df.apply(function_on_a_row, axis=1)

在这种情况下,请按照您定义bid的方式进行操作,但是将参数x替换为“ row”,然后将df替换为“ row”,以使参数名称有意义,并使用:

df.bid_bucket = df.apply(bid, axis=1)

或在熊猫系列元素上应用定义的功能。

def function_on_an_elt(element_of_series):
  if element_of_series > ...
    ...

df.new_column = df.my_column_of_interest.apply(function_on_an_elt)

根据您的情况,相应地重新定义bid

在这里您尝试将两种方法混合使用,这是行不通的。