美文网首页
Pandas 100道练习题(二)

Pandas 100道练习题(二)

作者: butters001 | 来源:发表于2020-09-27 17:39 被阅读0次

    Pandas 100道练习题(二)

    题目逐渐变难(态)

    DataFrames: beyond the basics

    难度:中等

    1. 数据去重
    # 数据
    df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
    
    # 答案
    df.drop_duplicates(subset='A')
    
    22.png
    1. 每个元素减去所在行的平均值
    df = pd.DataFrame(np.random.random(size=(5, 3)))
    
    df.sub(df.mean(axis=1), axis=0)
    
    # 1. 首先获取每行的平均值
    rows_mean = df.mean(axis=1)
    # 2. 然后执行减法操作
    df.sub(rows_mean, axis=0)
    
    23.png
    1. 哪一列数字的总和最小?返回该列的标签
    df = pd.DataFrame(np.random.random(size=(5, 10)), columns=list('abcdefghij'))
    
    df.sum().idxmin()
    
    # 1. 首先计算每一列的和
    columns_sum = df.sum()
    # 2. 求和最小值的标签
    columns_sum.idxmin()
    
    24.png
    1. 计算一个DataFrame有多少唯一行(即忽略所有重复的行)
    df = pd.DataFrame(np.random.randint(0, 2, size=(10, 3)))
    
    len(df.drop_duplicates())
    
    1. 已知每行中恰好有5个NaN值。对每行查找,找到第三个是NaN的列标签

    返回结果如:[e,c,d,h,d]

    nan = np.nan
    data = [[0.04,  nan,  nan, 0.25,  nan, 0.43, 0.71, 0.51,  nan,  nan],
            [ nan,  nan,  nan, 0.04, 0.76,  nan,  nan, 0.67, 0.76, 0.16],
            [ nan,  nan, 0.5 ,  nan, 0.31, 0.4 ,  nan,  nan, 0.24, 0.01],
            [0.49,  nan,  nan, 0.62, 0.73, 0.26, 0.85,  nan,  nan,  nan],
            [ nan,  nan, 0.41,  nan, 0.05,  nan, 0.61,  nan, 0.48, 0.68]]
    columns = list('abcdefghij')
    df = pd.DataFrame(data, columns=columns)
    
    (df.isnull().cumsum(axis=1)==3).idxmax(axis=1)
    
    # 1. 将nan换成True,非nan换成False
    temp = df.isnull()
    # 2. 每行找第三个nan,就是找每行累加和是3时候的最小列索引
    sum_3 = temp.cumsum(axis=1)==3
    # 3. 找到每行第一个为True的值
    sum_3.idxmax(axis=1)
    
    26.png
    1. 对于每个组(a组,b组,c组),找到三个数相加的最大和
    df = pd.DataFrame({'grps': list('aaabbcaabcccbbc'), 
                       'vals': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})
    
    df.groupby('grps')['vals'].apply(lambda x: x.nlargest(3)).sum(level=0)
    
    # 1. 先分组
    group = df.groupby('grps')
    # 2. 对每一组的vals分别取出3个最大值
    largest_3 = group['vals'].apply(lambda x: x.nlargest(3))
    # 3. largest_3是个MultiIndex的Series,对第一层索引(a,b,c)分别求和,指定level层级
    largest_3.sum(level=0)
    
    27.png
    1. df数据如下,A和B都是0-100之间的数值,对A进行分段分组,求每组内B的和
    # df数据
    df = pd.DataFrame(np.random.RandomState(8765).randint(1, 101, size=(100, 2)), columns = ["A", "B"])
         A   B
    0   46  29
    1   75  22
    2   49  63
    3   33  43
    4   71  75
    ..  ..  ..
    95  60  87
    96  57  40
    97  86  19
    98  50  56
    99  97  94
    
    # 结果类似如下
    A
    (0, 10]      635
    (10, 20]     360
    (20, 30]     315
    (30, 40]     306
    (40, 50]     750
    (50, 60]     284
    (60, 70]     424
    (70, 80]     526
    (80, 90]     835
    (90, 100]    852
    
    df.groupby(pd.cut(df['A'], bins=range(0, 101, 10)))['B'].sum()
    
    # 1. 对A进行分段,可以用range(0, 101, 10)代替np.arange(0, 101, 10)
    cut_a = pd.cut(df['A'], np.arange(0, 101, 10))
    # 2. 按cut_a进行分组,再对每组的B进行求和
    df.groupby(cut_a)['B'].sum()
    
    28.png

    相关文章

      网友评论

          本文标题:Pandas 100道练习题(二)

          本文链接:https://www.haomeiwen.com/subject/uryluktx.html