0
点赞
收藏
分享

微信扫一扫

数据分析 pandas库常用操作 (中)

zmhc 2022-01-05 阅读 92

1、如何避免SettingWithCopyWarning

2、pandas数据排序

3、字符串处理

4、pandas的axis参数的理解

5、pandas的index索引的理解

6、pandas的merge归并dataFrame简介

7、pandas的concat合并dataFrame简介

这里续(上)的内容

1、如何避免SettingWithCopyWarning

def pandas_warn_deal():
    df = pd.read_excel("./testData.xlsx", skiprows=2)
    # 发出警告代码df[condition]['number']=df['number1']-number['number2']
    # 相关于df.get(condition).set(number)第一步的get发出警告
    # !!pandas的dataFrame的修改写操作,只允许在源dataFrame上进行,一步到位
    # 正确的写法,改为set一步操作
    condition = "your condition"
    df.loc[condition, "number"] = df['number1'] - df['number2']
    df[condition].head()  # 运行以后不报错

    # 解决方案二
    # 如果需要预筛选数据做后续的处理分析,使用copy复制dataFrame
    dfCopy = df[condition].copy()
    # 在新的dataFrame上操作
    dfCopy = df['number1'] - df['number2']
    dfCopy.head()  # 运行后不报错

    # !! 总之,pandas不允许先筛选dataframe,再进行修改写入

2、pandas数据排序

def pandas_sort_data():
    df = pd.read_csv('./tips.csv')
    # series的排序,适用于数字和文字
    # print(df['total_bill'].sort_values())  # 默认升序排列
    # print(df['total_bill'].sort_values(ascending=False))  # 降序排列

    # dataframe的排序
    print(df.sort_values(by="total_bill"))  # 以该键名为索引排序,默认升序排列
    print(df.sort_values(by="total_bill", ascending=False))  # 以该键名为索引排序,降序排列

    # 多列排序
    # 按多个列来排序,默认升序
    print(df.sort_values(by=['total_bill', 'size']))
    # 全按降序
    print(df.sort_values(by=['total_bill', 'size'], ascending=False))
    # 分别按不同排序
    print(df.sort_values(by=['total_bill', 'size'], ascending=[True, False]))

3、字符串处理

def pandas_deal_string():
    df = pd.read_csv('./tips.csv')

    # 参考series的str属性
    print(df["sex"].str)  # 类型StringMethods
    # 替换
    print(df['sex'].str.replace("male", "男"))
    # 参考该数据类型是不是数字
    print(df['sex'].str.isnumeric())  # 结果为False
    # !!该数据类型不内用len()方法查看长度

    # 使用str的startswith、contains等得到的bool可以做条件查询
    condition = df['sex'].str.startswith('Female')
    print(condition)  # 返回True or False的Series对象
    print(df[condition].head())  # 通过该series对象可以条件查询

    # 需要多次str处理的链式操作
    # 每次调用都会返回一个新的Series
    print(df['sex'].str.replace("e", "").str.slice(0, 3))  # slice是str的方法
    # 相当于
    print(df['sex'].str.replace("e", "").str[0:3])  # 切片

    # 使用正则表达式处理
    # 添加新列
    def gain_sex(x):
        a, b = x['sex'].split("a")
        return f"{a}和{b}两"

    df['sex2'] = df.apply(gain_sex, axis=1)
    print(df['sex2'])
    # 方法1:链式replace
    df['sex2'].str.replace('和', "a").str.replace("两", "a")
    # 方法2:相当于 正则
    df['sex2'].str.replace("[和两]", "a")

4、pandas的axis参数的理解

def pandas_axis():
    import numpy as np
    df = pd.DataFrame(
        np.arange(12).reshape(3, 4),
        columns=['A', 'B', 'C', 'D']
    )
    # 删除某列
    df.drop('A', axis=1)
    # 删除某行
    df.drop(1, axis=0)
    # 求行的平均值
    # axis=0 or axis=index
    # 因为指定运动的是行的axis所以按行位置运动变量,最后输出一列数据
    df.mean(axis=0)
    # axis=1 or axis=columns
    # 因为指定运动的是列的axis所以按列位置运动变量,最后输出一行数据
    df.mean(axis=1)

5、pandas的index索引的理解

def pandas_index():
    df = pd.read_csv('./tips.csv')
    #inplace=True表示修改当前数据列,drop=False让索引还保持在column里
    #以该字段为索引
    df.set_index("total_bill",inplace=True,drop=False)
    print(df)#可以看到索引变成了total_bill,并且该列还在dataframe里
    print(df.index)#索引也改变为该字段

    #使用index的查询方法
    print(df.loc[21.01].head(5))#loc里的为索引的值

    #使用column的condition查询方法
    print(df.loc[df['total_bill']==21.01].head())#效果类似

    #使用索引可以提升查询性能

6、pandas的merge归并dataFrame简介

def pandas_merge():
    # 这里只介绍最直观的写法
    import numpy as np
    df = pd.DataFrame(np.arange(12).reshape(3, 4),
                      columns=['A', 'B', 'C', 'D'])
    df2 = pd.DataFrame(np.arange(12, 24).reshape(3, 4),
                       columns=['A', 'E', 'G', 'H'])
    print(df)
    print(df2)
    df3 = pd.merge(df, df2, on='A', how='outer')
    print(df3)
    df4 = pd.merge(df, df2, left_on='A', right_on='E', how='inner')
    print(df4)
    df5=pd.merge(df,df2,how='left')
    print(df5)
    # 另外how还可以为inner、right、outer、left默认为inner

7、pandas的concat合并dataFrame简介

def pandas_concat():
    df = pd.DataFrame({
        'A': ['A0', 'A1', 'A2', 'A3'],
        'B': ['B0', 'B1', 'B2', 'B3'],
        'C': ['C0', 'C1', 'C2', 'C3'],
        'D': ['D0', 'D1', 'D2', 'D3'],
        'E': ['E0', 'E1', 'E2', 'E3']
    })
    df2 = pd.DataFrame({
        'A': ['A4', 'A5', 'A6', 'A7'],
        'B': ['B4', 'B5', 'B6', 'B7'],
        'C': ['C4', 'C5', 'C6', 'C7'],
        'D': ['D4', 'D5', 'D6', 'D7'],
        'F': ['F4', 'F5', 'F6', 'F7']
    })
    # 默认的concat,参数为axis=0,join="outer",ignore_index=False
    print(pd.concat([df, df2]))
    # 按列来拼接
    s1 = pd.Series(list(range(4)), name="F")
    print(pd.concat([df, s1], axis=1))

    # 添加多列的Series
    s2 = df.apply(lambda x: x['A'] + "_GG", axis=1)
    # 该s2设置一个键名
    s2.name = 'G'
    print(pd.concat([df, s1, s2], axis=1))

    # 列表可以只有series
    print(pd.concat([s1, s2], axis=1))
    # 列表也可以混合排列
    print(pd.concat([s1, df, s2], axis=1))

    # append函数
    # 给dataframe添加另一个dataframe
    print(df.append(df2, ignore_index=True))  # True忽略原来索引

    # 可以一行一行的给dataframe添加数据
    # 一个空的df3
    df3 = pd.DataFrame(columns=['A'])

    # 低性能版本
    for i in range(5):
        # 注意这里每次都在复制
        df3 = df3.append({'A': i}, ignore_index=True)
    print(df3)

    # 高性能版本,推荐使用
    # 第一个入参是一个列表,避免了多次复制
    df3 = pd.concat(
        [pd.DataFrame([i], columns=['A']) for i in range(5)],
        ignore_index=True
    )
    print(df3)

更多详细用法查看官方文档:http://www.pypandas.cn/docs/reference.html

举报

相关推荐

0 条评论