pandas如何将一行拆分为多行,一列拆分为多列

今天在工作中遇到要将pandas数据框的一行拆成多行,和一列拆为多列的需求,一台服务器中可以有多个网卡,每个网卡都有状态,通过网卡的上下行流量。下面以一组“数据”为例,来说一下pandas如何将一行拆分为多行,一列拆分为多列。

 需求如下图

思路:

1.先将(0,c)拆成一个数据框

2.再将新数据框拆成4列(list1,list2,list3,list4)

3. 将原始数据框的c列删除,合并两个数据框

import numpy
import pandas as pd
from tabulate import tabulate

dict1 = {"a": ["test1", "test2"], "b": ["up", "up"],
         "c": ["eth1|up|16G|32G\neth2|up|null|32G\neth3|up|null|32G", "eth0|up|32G|32G"]}

df1 = pd.DataFrame(dict1)
print(tabulate(df1, headers='keys', tablefmt='fancy_grid'))

上述代码中tabulate模块能够对二维数据进行表格输出,可以把列表进行表格格式化

 逐步实现: 

1.先将(0,c)拆成一个数据框

将字符串按换行符分割

df_2 = df1['c'].str.split('\n',expand=True)
df_2

 把行转为列

df_2 = df_2.stack()
df_2

 重置索引,将二级索引变为一级索引

df_2 = df_2.reset_index(level=1, drop=True)
df_2

2.再将新数据框拆成4列(list1,list2,list3,list4)

将数据以“|”为分隔符拆为4列 

df_2 = df_2.str.split('|', expand=True)
df_2

 

改索引名称 

df_2.columns = ["list1", "list2", "list3", "list4"]
df_2

 3. 将原始数据框的c列删除,合并两个数据框

 先将原始数据框的c列删除,再跟新数据框合并

df_new = df1.drop("c", axis=1).join(df_2)
df_new

 

格式化输出 

print(tabulate(df_new, headers='keys', tablefmt='fancy_grid'))

 一行代码实现:

df_test = df1.drop("c", axis=1).join(df1['c'].str.split('\n',expand=True).stack().reset_index(level=1, drop=True).str.split('|', expand=True))
print(tabulate(df_test, headers='keys', tablefmt='fancy_grid'))

 

 (需要单独改一下索引名)

源码:

# !/usr/bin/env python
# -*- coding: UTF-8 -*-

import numpy
import pandas as pd
from tabulate import tabulate

dict1 = {"a": ["test1", "test2"], "b": ["up", "up"],
         "c": ["eth1|up|16G|32G\neth2|up|null|32G\neth3|up|null|32G", "eth0|up|32G|32G"]}

df1 = pd.DataFrame(dict1)
print(tabulate(df1, headers='keys', tablefmt='fancy_grid'))
# 一行拆为多行
df_2 = df1['c'].str.split('\n',expand=True).stack().reset_index(level=1, drop=True)
# 一列拆多列
df_sp = df_2.str.split('|', expand=True)
# 改列名
df_sp.columns = ["list1", "list2", "list3", "list4"]
# 删除c列,合并数据框
df_new = df1.drop("c", axis=1).join(df_sp)
print(tabulate(df_new, headers='keys', tablefmt='fancy_grid'))

###########################################################
# 一步实现 一行拆为多行一列拆多列
df_test = df1.drop("c", axis=1).join(df1['c'].str.split('\n',expand=True).stack().reset_index(level=1, drop=True).str.split('|', expand=True))
print(tabulate(df_test, headers='keys', tablefmt='fancy_grid'))

参考1

  • 13
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马克图布s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值