使用混合元组和字符串列重新排序pandas DataFrame列

时间:2017-07-18 19:01:15

标签: python pandas

我有一个混合列名类型的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

我可以通过将列中的元组转换为字符串,或将字符串转换为元组,然后转换回来来解决这个问题。 但是,我真的想知道导致这个错误的原因,以及是否有办法以更优雅的方式绕过它。

1 个答案:

答案 0 :(得分:1)

df[np.array(["age", "name", (0,0)],dtype=object)]有效。

正如您所指出的,Python抱怨,因为包含列名的数组同时包含元组和字符串值。但显式创建一个具有dtype=object规范的数组会告诉数组保留任意对象而不是抱怨。如果跳过dtype参数,则推断出dtype,并且Python假定整个数组的dtype相同,从而导致错误。