2017-06-20 231 views
2

我有一个数据框,只包含一周的最后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 

,以使每天有两个值,而不是一个。

在熊猫中有这样一种奇特的方法吗?

回答

3

首先比较由iatDay列中选择的Day第一值和与cumsum创建新列。然后使用pivotset_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需要orderedcategorical排序指数:如果需要原始排序

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 
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 
相关问题