【问题标题】:Python Pandas convert column data typePython Pandas 转换列数据类型
【发布时间】:2017-02-03 12:25:03
【问题描述】:

我知道这样的问题已经被问了无数种,但到目前为止我还没有找到这个问题的答案。

我已将两个 .csv 文件与 Pandas 一起加入,现在我想在新加入的 .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() 之类的函数,但除非我的语法错误,否则它对我不起作用。

提前致谢!

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。 IIUYC,你想对NS应用 nscap 以获得NS_Cap,对吗?
  • 你在df_joined['NS_Cap'] = df_joined['NS'].clip_upper(13)之后看到:pandas.pydata.org/pandas-docs/stable/generated/…这里的错误是你正在尝试使用理解标量值的运算符比较数组,如果你做了df_joined['NS'].apply(nscap)那么它应该工作
  • 这就像一个魅力!太感谢了!到目前为止从未遇到过这种语法!
  • 嗨,一个新问题需要一个新帖子。如果任何答案满足您的原始问题,请投票/接受。只需在此处留下指向您的新帖子/问题的链接。谢谢!

标签: python python-2.7 csv pandas


【解决方案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()

结果:

记下第二个数据帧的最后两行。

希望这会有所帮助。

【讨论】:

  • 好答案。请注意,apply + lambda 通常比矢量化函数慢得多,因此 clip_upper 可能更好。
  • 我尝试了这两个选项,是的,它们似乎都比我之前尝试的要快得多。那么 clip_upper(xy) 不仅停止从该数字开始计数,而且还将每个高于该数字的数字设置为该数字?
  • @Khaled 没错。从技术上讲,您正在设置一个上限并剪辑之后发生的任何事情。
【解决方案2】:

(您的代码在nscap(df_joined["NS"] 末尾缺少括号。)

正如@EdChum 和@TheLaughingMan 所写,clip_upper 是您想要的。这个答案只是解决了您遇到错误的直接原因。

在函数中

def nscap(ns):
    if ns <= 13:
        x = ns
    elif ns > 13:
        x = 13
    return x

实际上,ns &lt;= 13numpy.ndarray 进行操作。当您将这样的数组与标量进行比较时,会发生广播,结果是一个数组,其中每个元素都指示它是否为真。

所以

if ns <= 13:

翻译成类似的东西

if numpy.array([True, False, True, True]):

而且我们无法理解这是否属实。这就是您遇到的错误:您需要指定您的意思是 all 条目是否为 true,some 条目是否为 true,等等。

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2018-05-05
    • 2019-10-11
    • 2023-03-23
    • 2015-11-30
    • 2016-05-02
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多