如何 dcast pandas 数据框并将行转换为列

我有以下熊猫数据框


 df1

 code  prod  rsp   date_from    date_to      time_from    time_to

 123   MS    75    2018-01-01   2018-01-02   06:00        05:59

 123   HS    65    2018-01-01   2018-01-02   06:00        05:59

 123   MS    76    2018-01-01   2018-01-02   10:00        05:59 

 123   MS    76    2018-01-01   2018-01-02   11:00        05:59 

 123   MS    73    2018-01-02   2018-01-03   06:00        05:59

 123   HS    64    2018-01-02   2018-01-03   06:00        05:59

 123   MS    73    2018-01-02   2018-01-03   10:00        05:59

我想要的数据框是


 code   prod   rsp_1  date_from      date_to    time_from_1   time_to_1   rsp_2   time_from_2   time_to_2

 123    MS     75     2018-01-01     2018-01-02   06:00         05:59       76     10:00        05:59

 123    HS     65     2018-01-01     2018-01-02   06:00         05:59        -      -              -              -             -

 123    MS     73     2018-01-02     2018-01-03   06:00         05:59        -      -              -              -             -

 123    HS     64     2018-01-02     2018-01-03   06:00         05:59        -      -              -              

我正在用 python 跟踪


L = list(map(tuple,price[['code','prod','date_from']].values))

s = pd.Series(L, index=price.index)

s = s.ne(s.shift()).cumsum()

g = s.groupby(s).cumcount()


df1 = (price.set_index(['code','prod','date_from', s,g])

   .unstack()

   .sort_index(level=1, axis=1)

   .reset_index(level=2, drop=True))


   df1.columns = [f'{i}_{j+1}' for i, j in df1.columns]

   df1 = df1.reset_index()

我希望将独特的价格rsp纳入列。egin df1for productMS和date_from2018-01-01 有两个重复的条目rsp76,所以我们将只考虑第一个条目。所以对于 1 个产品,我们将只有一个日期和相应的价格变化历史。


慕标5832272
浏览 311回答 1
1回答

蓝山帝景

使用drop_duplicates然后似乎解决方案应该被简化:#by one columnprice = price.drop_duplicates('rsp')#if necessary by multiple columns#cols = ['code','prod','date_from', 'date_to', 'rsp']#price = price.drop_duplicates(subset=cols) g = price.groupby(['code','prod','date_from', 'date_to']).cumcount()df1 = (price.set_index(['code','prod','date_from','date_to', g])            .unstack()            .sort_index(level=1, axis=1))df1.columns = [f'{i}_{j+1}' for i, j in df1.columns]df1 = df1.reset_index()print (df1)   code prod   date_from     date_to  rsp_1 time_from_1 time_to_1  rsp_2  \0   123   HS  2018-01-01  2018-01-02   65.0       06:00     05:59    NaN   1   123   HS  2018-01-02  2018-01-03   64.0       06:00     05:59    NaN   2   123   MS  2018-01-01  2018-01-02   75.0       06:00     05:59   76.0   3   123   MS  2018-01-02  2018-01-03   73.0       06:00     05:59    NaN     time_from_2 time_to_2  0         NaN       NaN  1         NaN       NaN  2       10:00     05:59  3         NaN       NaN  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python