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

pra*_*een 6 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)
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Arr*_*uff 8

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

df['new'] = df['old'].map(d)
Run Code Online (Sandbox Code Playgroud)

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

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

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


jez*_*ael 4

主要问题是选择old列 getDataFrameSeries,因此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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

另一个问题应该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]])
Run Code Online (Sandbox Code Playgroud)

解决方案是扁平化的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
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是MultiIndex使用元组进行映射并分配给 new 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]])
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的详细解答!问题确实是因为重复的列。我永远不会怀疑这一点。所以我调用 pd.concat 在 4 个不同的列上调用 get_dummies 。我在 4 个不同的 pd.concat 调用中执行此操作。但是,我将其更改为单个 pd.concat 调用,并将数据帧和列属性传递给 get_dummies。由于某种原因,此更改开始创建重复的列,我必须恢复此更改。 (3认同)