用Numpy对Pandas对象变形到底有多简单?

举报
小小明-代码实体 发表于 2021/10/11 23:24:04 2021/10/11
【摘要】 需求如下: 源数据是左边的形式,需要转换成右边的形式。 对于这种需求直接使用Pandas是比较麻烦的,如果使用numpy来处理就会非常简单。 到底有多简单的呢?咱们一起看看吧。 首先我们读取数...

需求如下:

image-20210708132146058

源数据是左边的形式,需要转换成右边的形式。

对于这种需求直接使用Pandas是比较麻烦的,如果使用numpy来处理就会非常简单。

到底有多简单的呢?咱们一起看看吧。

首先我们读取数据:

import pandas as pd
import numpy as np

df = pd.read_excel("data.xlsx")

  
 
  • 1
  • 2
  • 3
  • 4

得到上面的源码数据形式,下面开始使用numpy进行数据重组,完整代码如下:

result = []
for row in df.values:
    result.append(
        np.c_[
            [row[0]]*4,
            row[1:5],
            row[5:],
            ['top', 'mid', 'bot', 'full']
        ]
    )
result = pd.DataFrame(np.vstack(result), columns=[
    "stnm", "value1", "value2", "period"])
result

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

image-20210708132421153

假如这类需求很多,我们完全可以将以上过程封装起来:

def split_reshape_df(df, tags=['top', 'mid', 'bot', 'full']):
    result = []
    for row in df.values:
        result.append(
            np.c_[[row[0]]*len(tags), row[1:len(tags)+1],
                  row[len(tags)+1:], tags]
        )
    result = pd.DataFrame(np.vstack(result), columns=[
        df.columns[0], "value1", "value2", "period"])
    return result

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

下面我们简单详解一下上述代码的关键点:

for row in df.values取出了DataFream的Numpy对象并迭代出来每一行。

对于每行对应的narray对象都可以通过角标访问,row[n]访问了角标n位置的数据。

最后是数据的横向拼接与纵向拼接。

对于横向拼接,我们可以使用的方法有:

np.c_[row[1:5], row[5:]]
# 等价于:
np.column_stack([row[1:5], row[5:]])
# 等价于:
np.hstack([row[1:5, np.newaxis], row[5:, np.newaxis]])
# 等价于:
np.concatenate([row[1:5, np.newaxis], row[5:, np.newaxis]], axis=1)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中np.newaxis的本质等于None,可以直接用None替换,例如:

np.hstack([row[1:5, None], row[5:, None]])

  
 
  • 1

个人觉得np.c_最简单省事,和column_stack一样实现了自动将一维数组转换为2维列向量。

对于纵向拼接,我们可以使用的方法有:

np.r_[result[0], result[1]]
# 等价于:
np.row_stack([result[0], result[1]])
# 等价于:
np.vstack([result[0], result[1]])
# 等价于(concatenate的axis参数默认值为0,可以省略):
np.concatenate([result[0], result[1]])

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

由于python并不支持np.r_[*result]这种语法,所以我使用了np.vstack(result)这种方法进行纵向拼接。

本文篇幅很短,那是因为用numpy对pandas变形实在是太简单了。

文章来源: xxmdmst.blog.csdn.net,作者:小小明-代码实体,版权归原作者所有,如需转载,请联系作者。

原文链接:xxmdmst.blog.csdn.net/article/details/118572617

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。