微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 在pandas中重新格式化Dataframe

我有一个非常奇怪的格式的Dataframe:

id      Code   Week1   Week2  week3
sunday   nan    nan    nan    nan
id      Code   Week1   Week2  week3
 1      100     y       y      n
 2      200     n       y      n
 3      300     n       n      y
Monday   nan    nan    nan    nan
id      Code   Week1   Week2  week3
 1      500     n       y      y
 2      600     y       y      y
Tuesday nan     nan    nan     nan 
id      Code   Week1   Week2  week3
 1      800     n       y      y
 2      900     y       n      y     

我想以这种格式带来它:

Code  Day    Week
100  Sunday    1
600  Monday    1
900  Tuesday   1
100  Sunday    2
200  Sunday    2
500  Monday    2
600  Monday    2
800  Tuesday   2
300  Sunday    3
500  Monday    3
600  Monday    3
800  Tuesday   3
900  Tuesday   3

即如果一周内代码的值为y,则该代码将在该周访问.

在熊猫中有没有办法做到这一点?

解决方法:

您可以使用:

df.index = df['id'].where(df['Code'].isnull()).ffill()
df = df[(df['Code'] != 'Code') & (df['id'] != df.index)]
df = df.rename_axis('Day').rename_axis('Week', 1)
df = df.set_index(['id','Code'], append=True)
       .replace({'n':np.nan})
       .stack().reset_index(name='val')
df['Week'] = df['Week'].str.extract('(\d+)', expand=False).astype(int)

cols = ['Code','Day','Week']
df = df.drop(['val','id'], axis=1)[cols].sort_values(['Week','Code']).reset_index(drop=True)
print (df)
    Code      Day  Week
0    100   sunday     1
1    600   Monday     1
2    900  Tuesday     1
3    100   sunday     2
4    200   sunday     2
5    500   Monday     2
6    600   Monday     2
7    800  Tuesday     2
8    300   sunday     3
9    500   Monday     3
10   600   Monday     3
11   800  Tuesday     3
12   900  Tuesday     3

对于一般输出 – 具有所有y和n值的id列删除替换:

df.index = df['id'].where(df['Code'].isnull()).ffill()
df = df[(df['Code'] != 'Code') & (df['id'] != df.index)]
df = df.rename_axis('Day').rename_axis('Week', 1)
df = df.set_index(['id','Code'], append=True).stack().reset_index(name='val')
df['Week'] = df['Week'].str.extract('(\d+)', expand=False).astype(int)
print (df)
        Day id Code  Week val
0    sunday  1  100     1   y
1    sunday  1  100     2   y
2    sunday  1  100     3   n
3    sunday  2  200     1   n
4    sunday  2  200     2   y
5    sunday  2  200     3   n
6    sunday  3  300     1   n
7    sunday  3  300     2   n
8    sunday  3  300     3   y
9    Monday  1  500     1   n
10   Monday  1  500     2   y
11   Monday  1  500     3   y
12   Monday  2  600     1   y
13   Monday  2  600     2   y
14   Monday  2  600     3   y
15  Tuesday  1  800     1   n
16  Tuesday  1  800     2   y
17  Tuesday  1  800     3   y
18  Tuesday  2  900     1   y
19  Tuesday  2  900     2   n
20  Tuesday  2  900     3   y

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐