前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-科学计算-pandas-20-部分列获取及部分行合并

Python-科学计算-pandas-20-部分列获取及部分行合并

作者头像
zishendianxia
发布2021-07-20 11:22:59
5920
发布2021-07-20 11:22:59
举报
文章被收录于专栏:Python工程师Python工程师

系统:Windows 10 编辑器:JetBrains PyCharm Community Edition 2018.2.2 x64 pandas:1.1.5

  • 这个系列讲讲Python的科学计算及可视化
  • 今天讲讲pandas模块
  • 按照时间列,得出每行属于上中下旬,进而对df进行分组

Part 1:场景描述

  1. 已知df1,包括6列,"quality_1", "measure_value", "up_tol", "down_tol", "group", "label"
  2. 只需要其中的'quality_1', 'group', 'label',合计3列参与后续演示,记为df2
  3. 按照group组进行分组,label去重,以,链接,记为df3

df1

df2

df3

Part 2:代码

代码语言:javascript
复制
import pandas as pd


# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置显示长度为100
pd.set_option('max_colwidth', 100)
# 设置对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 设置打印宽度
pd.set_option('display.width', 180)

dict_1 = {"quality_1": ["pos_1", "pos_1", "pos_2", "pos_2", "pos_3"],
          "measure_value": [6, 4, 6, 3.5, 2.5],
          "up_tol": [5, 5, 3, 3, 2],
          "down_tol": [-5, -5, -3, -3, 2],
          "group": ["A", "A", "B", "B", "C"],
          "label": ["小雨", "小雨", "中雨", "小雪", "中雪"]}

# 生成df
df1 = pd.DataFrame(dict_1, columns=["quality_1", "measure_value", "up_tol", "down_tol", "group", "label"])
print('\ndf1')
print(df1)

# 只保留部分列
list_output_fields = ['quality_1', 'group', 'label']
df2 = df1[list_output_fields]
print('\ndf2')
print(df2)


def concat_func1(x):
    print("\nx")
    print(x)
    y = pd.Series({
        'label': ','.join(x['label'].unique())
    }
    )
    print("\ny")
    print(y)
    print(type(y))
    return y


def concat_func2(x):
    y = pd.Series({
        'label': ','.join(x['label'].unique()),
        'quality_1': '+'.join(x['quality_1']),
    }
    )
    return y


# 组合
df3 = df2.groupby(df2['group']).apply(
    concat_func1).reset_index()
print('\ndf3')
print(df3)

print('\n')
print('分步骤展示')
df31 = df2.groupby(df2['group'])
list31 = list(df31)
print('\ndf31')
print(df31)
print('\nlist31')
print(list31)


df32 = df31.apply(concat_func2)
print('\ndf32')
print(df32)


df33 = df32.reset_index()
print('\ndf33')
print(df33)

代码截图

Part 3:输出结果

Part 4:部分代码解读

  1. df获取部分列数据,使用df[字段列表],注意list_output_fields是一个列表
    • list_output_fields = ['quality_1', 'group', 'label']
    • df2 = df1[list_output_fields]
  2. df3 = df2.groupby(df2['group']).apply(concat_func1).reset_index(),以group列对df2进行分组,本示例中生成3个df,然后分别应用apply里面的函数
  3. pd.Series({'label': ','.join(x['label'].unique())},对其中的label列进行去重,然后用,连接起来。pd.Series(参数),若需要对多列进行处理,其中的参数是个字典,键是列名,值是处理方法,增加键值对即可 4.df32.reset_index(),索引进行重置,原索引变成一个列,如下图所示

Ps:apply函数这块之前也写过文章,但总觉得还没有理解透,后续可能还会写一些应用文章

reset_index

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python工程师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档