为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2021-09-14 13:44:34
我有以下熊猫数据框 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 个产品,我们将只有一个日期和相应的价格变化历史。
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

使用drop_duplicates然后似乎解决方案应该被简化:


#by one column

price = 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  


查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 310 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信