为什么pandas series.map方法适用于列连接?

时间:2015-07-08 19:32:08

标签: python pandas

从几个other posts开始,在数据框中连接列的一种简单方法是使用map命令,如下例所示。 map函数返回一个系列,那么为什么不能只使用常规系列而不是map?

import pandas as pd
df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]},index=['m','n','o'])
df['x'] = df.a.map(str) + "_x"

    a   b   x

m   1   4   1_x
n   2   5   2_x
o   3   6   3_x

即使我专门创建了一个系列,这也有效。

df['y'] = pd.Series(df.a.map(str)) + "_y"

    a   b   x    y
m   1   4   1_x  1_y
n   2   5   2_x  2_y
o   3   6   3_x  3_y

这不起作用,它提供了一个TypeEror

df['z'] = df['a'] + "_z"
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'str'

这不起作用:

df['z'] = pd.Series(df['a']) + "_z"
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'str'

我检查了地图是否在引擎盖下返回了不同类型的对象,但它似乎并不是:

type(pd.Series(df.a.map(str)))
pandas.core.series.Series

type(pd.Series(df['a']))
pandas.core.series.Series

我对地图正在做什么感到困惑,这使得这项工作以及地图如何继续进行后续字符串算术。

1 个答案:

答案 0 :(得分:1)

map将输入值映射到传入类型中的相应值。

通常传入的类型是一个系列,字典或函数,在你的情况下,它将strctor作为一个函数调用,只是将它与'_x'连接起来。

但是,由于您发现df['a'] + "_z"pd.Series(df['a']) + "_z"无法正常工作,因为没有为这些类型定义操作数(ndarray {{1} })。

你可以使用:

str

需要考虑的是,当您致电In [8]: df['a'].astype(str) + '_z' Out[8]: m 1_z n 2_z o 3_z Name: a, dtype: object 时,dtype实际上已更改为df['a'].map(str)

str

因此,您可以看到为什么您的第一个版本有效,因为您实际上更改了In [13]: df['a'].map(str).dtype ​ Out[13]: dtype('O') 或系列,因此上述内容与dtype相同