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