因此,我的数据集按位置包含 n 个日期的一些信息。问题是每个日期实际上是不同的列标题。例如 CSV 看起来像
location name Jan-2010 Feb-2010 March-2010 A "test" 12 20 30 B "foo" 18 20 25
我想要的是它看起来像
location name Date Value A "test" Jan-2010 12 A "test" Feb-2010 20 A "test" March-2010 30 B "foo" Jan-2010 18 B "foo" Feb-2010 20 B "foo" March-2010 25
我的问题是我不知道列中有多少日期(尽管我知道它们总是在名称之后开始)
UPDATE 从 v0.20 开始,melt是一阶函数,您现在可以使用
melt
df.melt(id_vars=["location", "name"], var_name="Date", value_name="Value") location name Date Value 0 A "test" Jan-2010 12 1 B "foo" Jan-2010 18 2 A "test" Feb-2010 20 3 B "foo" Feb-2010 20 4 A "test" March-2010 30 5 B "foo" March-2010 25
旧(ER)版本: <0.20
您可以使用pd.melt获得大部分的方式,然后排序:
pd.melt
>>> df location name Jan-2010 Feb-2010 March-2010 0 A test 12 20 30 1 B foo 18 20 25 >>> df2 = pd.melt(df, id_vars=["location", "name"], var_name="Date", value_name="Value") >>> df2 location name Date Value 0 A test Jan-2010 12 1 B foo Jan-2010 18 2 A test Feb-2010 20 3 B foo Feb-2010 20 4 A test March-2010 30 5 B foo March-2010 25 >>> df2 = df2.sort(["location", "name"]) >>> df2 location name Date Value 0 A test Jan-2010 12 2 A test Feb-2010 20 4 A test March-2010 30 1 B foo Jan-2010 18 3 B foo Feb-2010 20 5 B foo March-2010 25
(可能想扔一个.reset_index(drop=True),只是为了保持输出干净。)
.reset_index(drop=True)
注意 :pd.DataFrame.sort 已弃用,支持pd.DataFrame.sort_values.
pd.DataFrame.sort
pd.DataFrame.sort_values