2017-06-20 228 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 
相關問題