首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas根据日期范围分解列

Pandas根据日期范围分解列
EN

Stack Overflow用户
提问于 2020-06-15 21:41:11
回答 2查看 63关注 0票数 3

我有一个数据帧,如下所示:

代码语言:javascript
复制
Col1    6/13/2020-6/15/2020 6/16/2020
A1      2.3                 1.65
A2      1.4                 1.4
A3      1.3                 1.3

我想在存在daterange时分解列,这由列名中存在的-表示。

期望的结果如下:

代码语言:javascript
复制
Col1    6/13/2020   6/14/2020   6/15/2020   6/16/2020
A1     2.3          2.3         2.3         1.65
A2     1.4          1.4         1.4         1.4
A3     1.3          1.3         1.3         1.3

我不确定如何在柱子上爆炸它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 21:58:17

我们还在做explode

代码语言:javascript
复制
s=df.set_index('Col1').T.reset_index()
s
Out[49]: 
Col1                index    A1   A2   A3
0     6/13/2020-6/15/2020  2.30  1.4  1.3
1               6/16/2020  1.65  1.4  1.3
s['index']=[pd.date_range(x.split('-')[0],x.split('-')[-1]) for x in s['index']]
s=s.explode('index').set_index('index').T.reset_index()
s
Out[52]: 
index Col1  2020-06-13 00:00:00  ...  2020-06-15 00:00:00  2020-06-16 00:00:00
0       A1                  2.3  ...                  2.3                 1.65
1       A2                  1.4  ...                  1.4                 1.40
2       A3                  1.3  ...                  1.3                 1.30
[3 rows x 5 columns]
票数 5
EN

Stack Overflow用户

发布于 2020-06-15 21:54:49

将非datetimes列转换为索引,然后在列表理解中使用numpy.broadcast_to创建新的DataFrame,最后通过concat连接在一起

代码语言:javascript
复制
df1 = df.set_index('Col1')

dfs = [pd.DataFrame(data=np.broadcast_to(df1.iloc[:,[i]].to_numpy(), 
                                         shape=(len(df1), len(pd.date_range(s, e)))), 
                   index=df1.index, 
                   columns=pd.date_range(s, e))
      if pd.notna(e) 
      else pd.DataFrame(df1.iloc[:,[i]].to_numpy(), 
                        index=df1.index, 
                        columns=[pd.to_datetime(s)]) 
      for i, (s, e) in enumerate(df1.columns.str.split('-', expand=True))]

df = pd.concat(dfs, axis=1)
print (df)
      2020-06-13  2020-06-14  2020-06-15  2020-06-16
Col1                                                
A1           2.3         2.3         2.3        1.65
A2           1.4         1.4         1.4        1.40
A3           1.3         1.3         1.3        1.30

如果可能重叠:

代码语言:javascript
复制
print (df)
  Col1  6/13/2020-6/16/2020  6/16/2020
0   A1                  2.3       1.65 <- 6/16/2020 is overlap
1   A2                  1.4       1.40
2   A3                  1.3       1.30

df1 = df.set_index('Col1')

dfs = [pd.DataFrame(data=np.broadcast_to(df1.iloc[:,[i]].to_numpy(), 
                                         shape=(len(df1), len(pd.date_range(s, e)))), 
                   index=df1.index, 
                   columns=pd.date_range(s, e))
      if pd.notna(e) 
      else pd.DataFrame(df1.iloc[:,[i]].to_numpy(), 
                        index=df1.index, 
                        columns=[pd.to_datetime(s)]) 
      for i, (s, e) in enumerate(df1.columns.str.split('-', expand=True))]

df = pd.concat(dfs, axis=1).sum(level=0, axis=1)
print (df)
      2020-06-13  2020-06-14  2020-06-15  2020-06-16
Col1                                                
A1           2.3         2.3         2.3        3.95
A2           1.4         1.4         1.4        2.80
A3           1.3         1.3         1.3        2.60
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62389462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档