我有一个混合列名类型的DataFrame:一些列名是字符串,一些是元组。 有没有办法重新排序列而不改变列名的类型?
例如,如果所有列都是字符串,则可以正常工作:
df = pd.DataFrame([["Alice", 34],
["Bob", 55]])
df.columns = ["name", "age"]
df[["age", "name"]]
# Out:
age name
0 34 Alice
1 55 Bob
如果所有列都是元组,这也没有问题:
df = pd.DataFrame([[5, 30],
[6, 31]])
df.columns = [(0,0), (1,1)]
df[[(1,1), (0,0)]]
# Out[15]:
(1, 1) (0, 0)
0 30 5
1 31 6
但是,如果列是混合字符串和元组,则会出错。
df = pd.DataFrame([["Alice", 0, 34],
["Bob", 1, 55]])
df.columns = ["name", (0,0), "age"]
df[["age", "name", (0,0)]]
# Out:
ValueError: setting an array element with a sequence
我可以通过将列中的元组转换为字符串,或将字符串转换为元组,然后转换回来来解决这个问题。 但是,我真的想知道导致这个错误的原因,以及是否有办法以更优雅的方式绕过它。
答案 0 :(得分:1)
df[np.array(["age", "name", (0,0)],dtype=object)]
有效。
正如您所指出的,Python抱怨,因为包含列名的数组同时包含元组和字符串值。但显式创建一个具有dtype=object
规范的数组会告诉数组保留任意对象而不是抱怨。如果跳过dtype参数,则推断出dtype,并且Python假定整个数组的dtype相同,从而导致错误。