我有一个数据框,它只包含一周的最后14天,每个都有一个整数值。我想把下周的每一天的价值结合起来。
这是我的数据框:
Day Total
0 Tue 66
1 Wed 54
2 Thu 47
3 Fri 60
4 Sat 41
5 Sun 44
6 Mon 73
7 Tue 67
8 Wed 51
9 Thu 56
10 Fri 47
11 Sat 42
12 Sun 43
13 Mon 46
......我希望它看起来像这样......
Day Total1 Total2
0 Tue 66 67
1 Wed 54 51
2 Thu 47 56
3 Fri 60 47
4 Sat 41 42
5 Sun 44 43
6 Mon 73 46
这样每天都有两个值,而不是一个。
Pandas有没有一种奇特的方法呢?
答案 0 :(得分:3)
首先将iat
选择的Day
的第一个值与列Day
进行比较,然后使用cumsum
创建新列。然后使用pivot
或set_index
+ unstack
,最后添加add_suffix
:
df['col'] = df['Day'].eq(df['Day'].iat[0]).cumsum()
df = df.pivot(index='Day', columns='col', values='Total').add_prefix('Total')
print (df)
col Total1 Total2
Day
Fri 60 47
Mon 73 46
Sat 41 42
Sun 44 43
Thu 47 56
Tue 66 67
Wed 54 51
另一种解决方案:
df['col'] = df['Day'].eq(df['Day'].iat[0]).cumsum()
df = df.set_index(['Day', 'col'])['Total'].unstack().add_prefix('Total')
print (df)
col Total1 Total2
Day
Fri 60 47
Mon 73 46
Sat 41 42
Sun 44 43
Thu 47 56
Tue 66 67
Wed 54 51
如果想要按days
排序索引需要ordered
categorical
:
days = ['Sun', 'Mon','Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
df['Day'] = df['Day'].astype('category', categories=days, ordered=True)
df['col'] = df['Day'].eq(df['Day'].iat[0]).cumsum()
df = df.set_index(['Day', 'col'])['Total'].unstack().add_prefix('Total')
print (df)
col Total1 Total2
Day
Sun 44 43
Mon 73 46
Tue 66 67
Wed 54 51
Thu 47 56
Fri 60 47
Sat 41 42
如果需要原始订单,请使用reindex_axis
:
df['col'] = df['Day'].eq(df['Day'].iat[0]).cumsum()
a = df.loc[df['col'] == 1, 'Day']
df = df.set_index(['Day', 'col'])['Total'].unstack()
.add_prefix('Total')
.reindex_axis(a, axis=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
Day Total1 Total2
0 Tue 66 67
1 Wed 54 51
2 Thu 47 56
3 Fri 60 47
4 Sat 41 42
5 Sun 44 43
6 Mon 73 46
答案 1 :(得分:0)
不能与jezrael的解决方案相比,但想分享一个相对简单的方法!此解决方案不会保留顺序:
pd.pivot(df.Day, df.groupby('Day').cumcount(), df.Total).rename(columns={0: 'Total 1', 1: 'Total 2'}).reset_index()
Day Total 1 Total 2
0 Fri 60 47
1 Mon 73 46
2 Sat 41 42
3 Sun 44 43
4 Thu 47 56
5 Tue 66 67
6 Wed 54 51