我知道像这样的问题被问到了数十种类型,但到目前为止我还没有找到这个问题的答案。
我已经与Pandas一起加入了两个.csv文件,现在我想在新加入的.csv文件中添加更多列,并根据已有的数据计算值。
但是,我一直收到这个错误:
"The truth value of a is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
现在这显然是我的列的数据类型(全部是整数)的问题,但我还没有找到一种(工作)方式将该列设置为整数。
这是我的代码:
import pandas
def nscap(ns):
if ns <= 13:
x = ns
elif ns > 13:
x = 13
return x
df_1 = pandas.read_csv("a.csv", sep=';', names=["DWD_ID", "NS"], header=0)
df_2 = pandas.read_csv("b.csv", sep=';', names=["VEG", "DWD_ID"], header=0)
df_joined = pandas.merge(df_1, df_2, on="DWD_ID")
df_joined["NS_Cap"] = nscap(df_joined["NS"])
如果我设置
df_joined["NS_Cap"] = nscap(20)
代码工作正常
我尝试过.astype(int)或.to_numeric()等函数,但除非我的语法错误,否则它对我不起作用。
提前致谢!
答案 0 :(得分:1)
与@ EdChum的评论一样,您需要使用clip(upper=13)
或clip_upper(13)
。另一个可以帮助您长期使用此类实例的选项是将apply
与lambda函数一起使用。这是一个非常好的全能方法。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(5,18,size=(5, 4)), columns=list('ABCD'))
nscap = lambda x: min(x, 13)
print df.head()
print '-' * 20
df['NSCAP'] = df['D'].apply(nscap)
print df.head()
结果:
记下第二个数据帧的最后两行。
希望这有帮助。
答案 1 :(得分:1)
(您的代码缺少nscap(df_joined["NS"]
末尾的括号。)
@EdChum和@TheLaughingMan写道,clip_upper
就是你想要的。这个答案只是解决了你得到的错误的直接原因。
在功能
中def nscap(ns):
if ns <= 13:
x = ns
elif ns > 13:
x = 13
return x
有效地ns <= 13
对numpy.ndarray
进行操作。将这样的数组与标量进行比较时,会发生广播,结果是一个数组,其中每个元素指示它是否为真。
所以
if ns <= 13:
转换为类似
的内容if numpy.array([True, False, True, True]):
并且无法理解这是否属实。这就是你得到的错误:你需要指明你是否意味着所有条目是否为真,某些条目是否为真,等等。