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

2021-07-20 11:22:59 浏览数 (2)

系统: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

0 人点赞