4

我将如何执行不区分大小写的 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

是否有捷径可寻?

我对 concat on a 有同样的问题Series

这适用于DataFrame

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

但这不适用于 a 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)

所以我更新的问题是如何使用系列执行重命名/不区分大小写的连接?

4

2 回答 2

3

您可以通过以下方式执行此操作rename

pd.concat([df1, df1a.rename(index=str.lower)], axis=1)

编辑

如果您想使用MultiIndexed执行此Series操作,您现在需要手动设置它。pandas GitHub repo 上有一个错误报告等待修复(感谢@ViktorKerkez)。

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

您可以替换str.lower为您想使用的任何函数来重命名您的index.

请注意,您一般不能reindex在这里使用,因为它会尝试使用重命名的索引查找值,因此它将返回nan值,除非您rename对原始index.

于 2013-08-19T01:06:13.813 回答
1

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

s.index = pd.MultiIndex.from_tuples(
              s.index.map(lambda x: tuple(map(str.lower, x)))
          )
于 2013-08-19T13:38:32.413 回答