不区分大小写的pandas.concat

时间:2013-08-19 00:44:44

标签: pandas

我如何执行不区分大小写的pandas.concat?

df1 = pd.DataFrame({"a":[1,2,3]},index=["a","b","c"])
df2 = pd.DataFrame({"b":[1,2,3]},index=["a","b","c"])
df1a = pd.DataFrame({"A":[1,2,3]},index=["A","B","C"])

pd.concat([df1, df2],axis=1)
   a  b
a  1  1
b  2  2
c  3  3

但这不起作用:

pd.concat([df1, df1a],axis=1)

    a   A
A NaN   1
B NaN   2
C NaN   3
a   1 NaN
b   2 NaN
c   3 NaN

有一种简单的方法吗?

我对Series上的concat有同样的问题。

适用于DataFrame

pd.DataFrame([11,21,31],index=pd.MultiIndex.from_tuples([("A",x) for x in ["a","B","c"]])).rename(str.lower)

但这不适用于Series

pd.Series([11,21,31],index=pd.MultiIndex.from_tuples([("A",x) for x in ["a","B","c"]])).rename(str.lower)
TypeError: descriptor 'lower' requires a 'str' object but received a 'tuple'

对于重命名,DataFrames使用:

def rename_axis(self, mapper, axis=1):
        index = self.axes[axis]
        if isinstance(index, MultiIndex):
            new_axis = MultiIndex.from_tuples([tuple(mapper(y) for y in x) for x in index], names=index.names)
        else:
            new_axis = Index([mapper(x) for x in index], name=index.name)

而重命名Series时:

result.index = Index([mapper_f(x) for x in self.index], name=self.index.name)

所以我更新的问题是如何使用Series?

执行重命名/不区分大小写的concat

2 个答案:

答案 0 :(得分:3)

您可以通过rename

执行此操作
pd.concat([df1, df1a.rename(index=str.lower)], axis=1)

修改

如果您想使用MultiIndex ed Series执行此操作,则需要手动设置,暂时。在大熊猫GitHub回购中等待修复a bug report(感谢@ViktorKerkez)。

s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: tuple(map(str.lower, x))))

您可以将str.lower替换为您要用来重命名index的任何功能。

请注意,此处不能使用reindex,因为它会尝试使用重命名的索引查找值,因此会返回nan值,除非您rename 1}}导致原始index没有变化。

答案 1 :(得分:1)

对于MultiIndexed Series对象,如果这不是错误,您可以执行以下操作:

s.index = pd.MultiIndex.from_tuples(
              s.index.map(lambda x: tuple(map(str.lower, x)))
          )