我怎样才能改变这个Pandas Dataframe?

时间:2017-06-20 14:53:15

标签: python pandas

我有一个数据框,它只包含一周的最后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有没有一种奇特的方法呢?

2 个答案:

答案 0 :(得分:3)

首先将iat选择的Day的第一个值与列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排序索引需要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