我对编程非常陌生(在python中),我想创建一个新变量,该变量是列的对数(来自导入的excel文件)。 我尝试过从该站点尝试不同的解决方案,但始终出现错误。 我最新的错误是AttributeError: 'str' object has no attribute 'log'.
我已经删除了所有不是"数字"的值,但是我仍然不知道如何将值从字符串转换为整数(如果是这种情况,因为" int(neighborhood)"不起作用)。
这是我现在拥有的代码:
import pandas as pd
import numpy as np
df=pd.read_excel("kwb-2016_del_col_del_row.xls")
df = df[df.m_woz !="."] # drop rows with values"."
neighborhood=df[df.recs=="Neighborhood"]
neighborhood=neighborhood["m_woz"]
print(neighborhood)
np.log(neighborhood)
这是我得到的错误:
AttributeError Traceback (most recent call last)
in ()
12 print(neighborhood)
13
---> 14 np.log(neighborhood)
AttributeError: 'str' object has no attribute 'log'
有人可以帮我吗?
但是解决该问题的方法是在注释y=np.log(buurt["g_woz"])中的下面两行。
感谢您的快速回复!该行也会产生错误(键错误)。如果我从该行中删除密钥,则会收到与上述相同的错误
然后,该列的名称不是g_woz。请不要仅仅丢弃那些出错的部分,这通常不是调试代码的好方法。
我不知道该怎么办,因为我很确定那是列的名称
@WillemVanOnsem我无法复制整个错误,但这是错误的开始:TypeError:必需为整数在上述异常的处理过程中,发生了另一个异常:KeyError Traceback(最近一次调用最近)
请重置您的内核,似乎您在此过程中已将np分配给其他内容。
buurt和neighborhood之间是什么关系?同样,在索引时使用.loc是一个好主意。
对不起,我已将此网站的英语更改为英语,但是很遗憾,我忘记在错误中进行更改。抱歉在错误中buurt = neighborhood
@Kate看来您已经掩饰了我的评论。您是否重新启动了内核?
@Kate:请编辑您的问题。
@c ??? s ????是的,我做到了。两次,但仍然是相同的错误
@WillemVanOnsem我应该怎么编辑?
@Kate这样做... del np; import numpy as np
Aaaaand,有效吗?
@c ??? s ????这样做了,我仍然遇到相同的错误
也许您不是要删除自己认为的数据?
尝试打印数据类型以查看它们是什么。
在DataFrame中,您的列可能用对象而不是数字填充。
print(df.dtypes)
另外,您可能想看看这两页
根据对象的类型(即str)从DataFrame中选择行
熊猫:将dtype对象转换为int
这是我构建并交互运行的示例,可以正确获取对数(不要键入>>>):
>>> raw_data = {'m_woz': ['abc', 'def', 1.23, 45.6, '.xyz'],
'recs': ['Neighborhood', 'Neighborhood',
'unknown', 'Neighborhood', 'whatever']}
>>> df = pd.DataFrame(raw_data, columns = ['m_woz', 'recs'])
>>> print(df.dtypes)
m_woz object
recs object
dtype: object
请注意,类型是对象,而不是float或int或str
继续,这是df和neighborhood的样子:
>>> df
m_woz recs
0 42 Neighborhood
1 def Neighborhood
2 1.23 unknown
3 45.6 Neighborhood
4 .xyz whatever
>>> neighborhood=df[df.recs=="Neighborhood"]
>>> neighborhood
m_woz recs
0 42 Neighborhood
1 def Neighborhood
3 45.6 Neighborhood
这是窍门...
此行选择neighborhood中int或float的所有行(如果复制/粘贴此行,请小心修复缩进
>>> df_num_strings = neighborhood[neighborhood['m_woz'].
apply(lambda x: type(x) in (int, float))]
>>> df_num_strings
m_woz recs
0 42 Neighborhood
3 45.6 Neighborhood
快到了...将数字从字符串转换为浮点数
>>> df_float = df_num_strings['m_woz'].astype(str).astype(float)
>>> df_float
0 42.0
3 45.6
最后,计算对数:
>>> np.log(df_float)
0 3.737670
3 3.819908
Name: m_woz, dtype: float64
这工作了! 除了apply函数的一部分之外,因为所有值都不被视为浮点数或整数,但是astype函数起作用。 我不知道为什么,但是我以前曾经尝试过那个,然后就没用了。 也许我尝试后更改了代码。 非常感谢您对@ coldspeed,WillemVanOnsem和akubot的努力!
@Kate好消息,如果您不介意,请将答案标记为正确