从几个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
我对地图正在做什么感到困惑,这使得这项工作以及地图如何继续进行后续字符串算术。
答案 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
相同