我遇到一个创建函数的问题,该函数将识别列中的特定值是否在两个值之间。
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().
有人有什么想法吗?
答案 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
。
在这里您尝试将两种方法混合使用,这是行不通的。