系统:Windows 10 编辑器:JetBrains PyCharm Community Edition 2018.2.2 x64 pandas:1.1.5
- 这个系列讲讲Python的科学计算及可视化
- 今天讲讲pandas模块
- 按照时间列,得出每行属于上中下旬,进而对df进行分组
Part 1:场景描述
- 已知df1,包括6列,
"quality_1", "measure_value", "up_tol", "down_tol", "group", "label"
- 只需要其中的
'quality_1', 'group', 'label'
,合计3列参与后续演示,记为df2 - 按照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:部分代码解读
- df获取部分列数据,使用
df[字段列表]
,注意list_output_fields
是一个列表list_output_fields = ['quality_1', 'group', 'label']
df2 = df1[list_output_fields]
df3 = df2.groupby(df2['group']).apply(concat_func1).reset_index()
,以group列对df2
进行分组,本示例中生成3个df
,然后分别应用apply
里面的函数pd.Series({'label': ','.join(x['label'].unique())}
,对其中的label列进行去重,然后用,
连接起来。pd.Series(参数)
,若需要对多列进行处理,其中的参数是个字典,键是列名,值是处理方法,增加键值对即可 4.df32.reset_index()
,索引进行重置,原索引变成一个列,如下图所示
Ps:apply函数这块之前也写过文章,但总觉得还没有理解透,后续可能还会写一些应用文章
reset_index