我将如何执行不区分大小写的 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)
所以我更新的问题是如何使用系列执行重命名/不区分大小写的连接?
最佳答案
您可以通过 rename
执行此操作:
pd.concat([df1, df1a.rename(index=str.lower)], axis=1)
编辑 :
如果你想用
MultiIndex
来做到这一点编辑 Series
你现在需要手动设置它。有a bug report在等待修复的 pandas GitHub 存储库(感谢 @ViktorKerkez)。s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: tuple(map(str.lower, x))))
您可以更换
str.lower
使用您想用来重命名 index
的任何函数.请注意,您不能使用
reindex
通常在这里,因为它尝试使用重命名的索引查找值,因此它将返回 nan
值,除非您的 rename
结果对原始 index
没有任何更改.
关于pandas - 不区分大小写的 pandas.concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305067/