重新排列熊猫数据框

用户名

我有一个数据表,看起来像这样:

Index | ref_num | year | jan_a | jan_b | jan_c | ... | dec_a | dec_b | dec_c
0     |   100   | 2000 | 10    | 15    |  8    | ... |    3  |  19   |  12
1     |   100   | 2001 | 8     | 18    |  2    | ... |    6  |  15   |  12
2     |   101   | 2000 | 18    | 11    |  0    | ... |    2  |  10   |  11
3     |   101   | 2001 | 9     | 13    |  9    | ... |    4  |  10   |  22

为了清楚起见,ref_num是唯一标识符。有很多年,每年所有12个月,每个月有3个类别。我需要将其转换为以下格式:

Index | ref_num | date    | a  | b  | c
0     | 100     | 01/2000 | 10 | 15 | 8
...
11    | 100     | 12/2000 |  3 | 19 | 12
...
23    | 100     | 12/2001 |  6 | 15 | 12

请注意,我不在乎这是否在熊猫中……它在一个csv文件中,因此,如果更容易在numpy中进行操作或在可以正常工作的文件中循环(我一直在盯着屏幕,现在已经无聊了几个小时)。

奕奕

重新pd.wide_to_long排列各列的名称,以便可以使用,然后结合年和月以构造所需的日期格式:

df.columns = [i if "_" not in i else "_".join(i.split("_")[::-1]) for i in df.columns]

s = (pd.wide_to_long(df, stubnames=list("abc"),
                     i=["Index", "num_ref", "year"],
                     j="month", sep="_", suffix=".*")
       .reset_index())

s["date"] = pd.to_datetime(s["year"].astype(str)+" "+s["month"]).dt.strftime("%m/%Y")

print (s.drop(["year","month"], 1).rename(columns={"num_ref":"ref_num"}))

   Index  ref_num   a   b   c     date
0      0      100  10  15   8  01/2000
1      0      100   3  19  12  12/2000
2      1      100   8  18   2  01/2001
3      1      100   6  15  12  12/2001
4      2      101  18  11   0  01/2000
5      2      101   2  10  11  12/2000
6      3      101   9  13   9  01/2001
7      3      101   4  10  22  12/2001

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章