如何将pandas数据框中的两行转换为列标题

30

我已经知道如何使用双索引,但是我还没有看到如何使用两行列标题。这可能吗?

例如,第一行是一个重复的日期系列:2016年、2016年、2015年、2015年

第二行是一个重复的数据系列。美元销售额、单位销售量、美元销售额、单位销售量。

因此,每个“美元销售额”标题实际上都与上面行中的日期相关联。

随后的行是具有数据的单独项目。

是否有一种方法可以进行groupby或某种方式使我可以拥有两个列标题?最终,我想通过日期将“美元销售额”对齐为一系列,以便我可以制作一个漂亮的图表。不幸的是,在下一个“美元销售额”值之前有多个列。(不仅仅是一个“单位销售量”列)。而且,如果我删除上面的日期行,则没有链接将每个“美元销售额”与每个日期联系起来。


1
你可以使用 pandas.MultiIndex 作为列标题。例如请查看 这个这个 - Midnighter
这个有效,谢谢。我不知道MultiIndex也适用于列标题...还在学习pandas。 - Stephen
2个回答

40
如果使用 pandas.read_csv()pandas.read_table(),你可以提供一个索引列表给header参数,指定你想用作列标题的行。Python会在df.columns中为你生成pandas.MultiIndex
df = pandas.read_csv('DollarUnitSales.csv', header=[0,1])

您还可以使用超过两行或不连续的行来指定列标题:

df = pandas.read_table('DataSheet1.csv', header=[0,2,3])

它会是什么样子?你能加一个例子吗? - PV8
1
太棒了,squareskittles的解决方案!!这正是我过去几天一直在寻找的!!非常感谢!! - ASH

0

可以从行创建MultiIndex,并将其分配为新的列标签。

例如,要进行以下转换,请使用pd.MultiIndex.from_frame()

result

df = pd.DataFrame([[2016, 2016, 2015, 2015], 
                   ['Dollar Sales', 'Unit Sales', 'Dollar Sales', 'Unit Sales'], 
                   [1, 2, 3, 4], [5, 6, 7, 8]], columns=[*'ABCD'])

new_labels = pd.MultiIndex.from_frame(df.iloc[:2].T.astype(str), names=['Year', 'Sales'])
df1 = df.set_axis(new_labels, axis=1).iloc[2:]

一个 MultiIndex 也可以从旧的列标签和数据帧行创建。例如,要进行以下转换,请使用 pd.MultiIndex.from_arrays()

result2

df = pd.DataFrame([['Dollar Sales', 'Unit Sales', 'Dollar Sales', 'Unit Sales'], 
                   [1, 2, 3, 4], [5, 6, 7, 8]], columns=[2016, 2016, 2015, 2015])

new_labels = pd.MultiIndex.from_arrays([df.columns, df.iloc[0]], names=['Year', 'Sales'])
df1 = df.set_axis(new_labels, axis=1).iloc[1:]

注意的一件重要事情是数据框的dtypes可能不适合它所持有的数据; 最后可能需要使用astype(int)等。

此外,如果索引需要重置,则可能需要使用reset_index(drop=True).


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接