熊猫-AttributeError:“ DataFrame”对象没有属性“ map”

时间:2019-02-09 16:04:01

标签: python-3.x pandas

我试图通过在现有列的基础上创建字典并在该列上调用“地图”功能来在数据框中创建新列。它似乎已经工作了一段时间。但是,笔记本电脑开始抛出

  

AttributeError:“ DataFrame”对象没有属性“ map”

我没有更改内核或python版本。这是我正在使用的代码。

dict= {1:A,
       2:B,
       3:C,
       4:D,
       5:E}

# Creating an interval-type 
data['new'] = data['old'].map(dict)

该如何解决?

3 个答案:

答案 0 :(得分:1)

主要问题是选择了old列后,得到的是DataFrame而不是Series,因此map的实现Series失败了。

此处应重复列old,因此,如果选择一个列,它将返回old中的所有列DataFrame

df = pd.DataFrame([[1,3,8],[4,5,3]], columns=['old','old','col'])
print (df)
   old  old  col
0    1    3    8
1    4    5    3

print(df['old'])
   old  old
0    1    3
1    4    5

#dont use dict like variable, because python reserved word
df['new'] = df['old'].map(d)
print (df)
  

AttributeError:“ DataFrame”对象没有属性“ map”

此列重复数据删除的可能解决方案:

s = df.columns.to_series()
new = s.groupby(s).cumcount().astype(str).radd('_').replace('_0','')
df.columns += new
print (df)
   old  old_1  col
0    1      3    8
1    4      5    3

另一个问题应该在列MultiIndex中,通过以下方法进行测试:

mux = pd.MultiIndex.from_arrays([['old','old','col'],['a','b','c']])
df = pd.DataFrame([[1,3,8],[4,5,3]], columns=mux)
print (df)
  old    col
    a  b   c
0   1  3   8
1   4  5   3

print (df.columns)
MultiIndex(levels=[['col', 'old'], ['a', 'b', 'c']],
           codes=[[1, 1, 0], [0, 1, 2]])

解决方案变平MultiIndex

#python 3.6+
df.columns = [f'{a}_{b}' for a, b in df.columns]
#puthon bellow
#df.columns = ['{}_{}'.format(a,b) for a, b in df.columns]
print (df)
   old_a  old_b  col_c
0      1      3      8
1      4      5      3

另一种解决方案是由MultiIndex使用元组进行映射并分配给新的tuple

df[('new', 'd')] = df[('old', 'a')].map(d)
print (df)
  old    col new
    a  b   c   d
0   1  3   8   A
1   4  5   3   D

print (df.columns)
MultiIndex(levels=[['col', 'old', 'new'], ['a', 'b', 'c', 'd']],
           codes=[[1, 1, 0, 2], [0, 1, 2, 3]])

答案 1 :(得分:1)

map是一种可以调用pandas.Series对象的方法。此方法在pandas.DataFrame对象上不存在。

df['new'] = df['old'].map(d)

在您的代码中^^^ df ['old'] 由于某种原因返回了pandas.Dataframe对象。

  • 正如@jezrael指出的,这可能是由于数据框中有多个 old 列。
  • 或者您的代码与您给出的示例不太相同。

  • 无论哪种方式都存在错误,因为您正在对pandas.Dataframe对象调用 map()

答案 2 :(得分:0)

import psutil    #pip install psutil
battery_detecting = psutil.sensors_battery()
plugged = battery_detecting.power_plugged
percent_battery = str(battery_detecting.percent)
plugged = "Plugged In" if plugged else "Not Plugged In"
print(percent_battery+'% | '+plugged)

没关系,因为 m 是 pd.Series 对象。下面的用法是错误的,因为m是pd.DataFrame对象。

import pandas as pd
f_dict = {1:0,2:1,3:2}
m = pd.Series([1,2,3])
res = m.map(f_dict)
print(res)