DataFrame基本操作 <三> 计算名次,移除重复数据,数据替换,划分区间,分组统计(变成类)

生成一个实例

df5 = DataFrame({‘b‘: [4.3, 7, -3, 2],
                 ‘a‘: [0, 1, 0, 1],
                 ‘c‘: [-2, 5, 8, -2.5]})
print(df5)

运行结果

     b  a    c
0  4.3  0 -2.0
1  7.0  1  5.0
2 -3.0  0  8.0
3  2.0  1 -2.5

计算名次

print(df5.rank() )       # 按行计算名次
print(df5.rank(axis=1))  # 按列计算名次

#这有意思了,这是计算名次,显示的结果是名次,不是里边值的内容,只能用在f类型,df5.rank()是垂直方向比大小,竖着四个谁最大,显示的数字最大,最大4,最小1

#df5.rank(axis=1)就是水平方向比大小,三个 数字之间比,最大3,最小1

运行结果

     b  a    c
0  4.3  0 -2.0
1  7.0  1  5.0
2 -3.0  0  8.0
3  2.0  1 -2.5
#原本
     b    a    c
0  3.0  1.5  2.0
1  4.0  3.5  3.0
2  1.0  1.5  4.0
3  2.0  3.5  1.0
#竖着比,也就是垂直比,4个值
     b    a    c
0  3.0  2.0  1.0
1  3.0  1.0  2.0
2  1.0  2.0  3.0
3  3.0  2.0  1.0
#水平比,3个值

重新生成一个实例,观察这个实例的生成方法

df6 = pd.DataFrame({‘k1‘: [‘one‘, ‘two‘] * 3 + [‘two‘],
                    ‘k2‘: [1, 1, 2, 3, 3, 4, 4]})

print(df6)

df7 = pd.DataFrame({‘k1‘: [‘one‘, ‘two‘] * 3 + [‘two‘],
                    ‘k2‘: list(‘1123344‘)})

print(df6)
print(df7)
#以上两种方法,效果一样,但是结果不一样。。怎么理解那,上边的k2是int,下边的k2是str,我一开始错误的以为一样了,现在我们拿df6来举例

运行结果

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4   #就写一个行了

移除重复的数据

print(df6.drop_duplicates()) # 移除重复的行
print(df6.drop_duplicates([‘k1‘])) # 移除某列有重复的行
print(df6[::-1].drop_duplicates([‘k1‘])) # 反向移除

#这里讲究了,第一个是垂直移除,移除的条件是同时满足k1,k2的值都相等

#第二个是k1列只有重复的都移除

#第三个是垂直反向开始

运行结果

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4
#原版
    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
#移除了重复的行‘two 4’
    k1  k2
0  one   1
1  two   1
#k1 去掉重复的
    k1  k2
6  two   4
4  one   3
#反向开始 去掉k1重复的

数据替换

这里是根据‘name’(cols)替换的。

我觉得这个方法挺重要的以后能用的上,挺好的。

i={k1[0]:123,k1[1:456}

df[‘name].map(i) #

k3 = {‘one‘: 2001, ‘two‘: 2002}
df6[‘k3‘] = df6[‘k1‘].map(k3) # 根据已有的键值做转换
print(df6[‘k3‘])
print(df6)
print(df6[‘k2‘].replace([2, 4], 0)) # 替换特定的值
print(df6)

#第一个,k1里边有‘one’,‘two’,创建k3,用map方法

#第二个就是字面意思,k2里边的2,4替换成0

运行结果

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4
#原版
0    2001
1    2002
2    2001
3    2002
4    2001
5    2002
6    2002
Name: k3, dtype: int64
#k3的数据
    k1  k2    k3
0  one   1  2001
1  two   1  2002
2  one   2  2001
3  two   3  2002
4  one   3  2001
5  two   4  2002
6  two   4  2002
#现版
0    1
1    1
2    0
3    3
4    3
5    0
6    0
Name: k2, dtype: int64
#替换后的k2
    k1  k2    k3
0  one   1  2001
1  two   1  2002
2  one   2  2001
3  two   3  2002
4  one   3  2001
5  two   4  2002
6  two   4  2002
#请注意!!!这里如果你打印df6,还是上一版,k2的新值没有赋过来,也就是replace返回的结果是单独的。

那么如何将新产生的k2赋值给df6

a=df6[‘k2‘].replace([2, 4], 0)
df6[‘k2‘]=a
print(df6)

运行结果

    k1  k2    k3
0  one   1  2001
1  two   1  2002
2  one   0  2001
3  two   3  2002
4  one   3  2001
5  two   0  2002
6  two   0  2002

完美

划分区间

对零散是数据划分区间

bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 对离散数据划分区间,cut用法,划分两个区间,0~2,2~4
print(bins)
df6[‘k2‘]=bins
print(df6)

运行结果

    k1  k2
0  one   1
1  two   1
2  one   2
3  two   3
4  one   3
5  two   4
6  two   4
#原版
0    (0, 2]
1    (0, 2]
2    (0, 2]
3    (2, 4]
4    (2, 4]
5    (2, 4]
6    (2, 4]
Name: k2, dtype: category
Categories (2, interval[int64]): [(0, 2] < (2, 4]]
#这里区间的意思是0~2之间的划为一块,2~4之间的划为一块
    k1      k2
0  one  (0, 2]  #1
1  two  (0, 2]  #1
2  one  (0, 2]  #2
3  two  (2, 4]  #3
4  one  (2, 4]  #3
5  two  (2, 4]  #4
6  two  (2, 4]  #4

同理,再来一个对比

bins = pd.cut(df6[‘k2‘], [0, 3, 4]) # 对离散数据划分区间,cut用法,划分两个区间,0~3,3~4
print(bins)
df6[‘k2‘]=bins
print(df6)

运行结果

    k1      k2
0  one  (0, 3]
1  two  (0, 3]
2  one  (0, 3]
3  two  (0, 3]
4  one  (0, 3]
5  two  (3, 4]
6  two  (3, 4]

按区间对离散数值进行统计

bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 对离散数据划分区间,cut用法,划分两个区间,0~2,2~4
print(pd.value_counts(bins)) # 按区间对离散值统计

运行结果

(2, 4]    4
(0, 2]    3
Name: k2, dtype: int64

生成新的‘name’,加上分类信息

bins = pd.cut(df6[‘k2‘], [0, 2, 4]) # 对离散数据划分区间,cut用法,划分两个区间,0~2,2~4
df6[‘k3‘] = bins  # 在原有dataframe上直接加上分类信息,这里生成了k3
print(df6)

运行结果

    k1  k2      k3
0  one   1  (0, 2]
1  two   1  (0, 2]
2  one   2  (0, 2]
3  two   3  (2, 4]
4  one   3  (2, 4]
5  two   4  (2, 4]
6  two   4  (2, 4]

分组统计

group_6=df6.groupby([df6[‘k3‘]]) # 分组,好像创建了一个类。。。。这里如果是k2或者k1,无法使用统计平均数,mean是个类的方法。

print(group_6.sum())  # 统计 求和
print(group_6.mean())  # 统计 平均数 这个平均数是k2的!!!这就是个类,没错就是把整个df6变成一个类了

运行结果

    k1  k2      k3
0  one   1  (0, 2]
1  two   1  (0, 2]
2  one   2  (0, 2]
3  two   3  (2, 4]
4  one   3  (2, 4]
5  two   4  (2, 4]
6  two   4  (2, 4]
        k2
k3
(0, 2]   4
(2, 4]  14
              k2
k3
(0, 2]  1.333333
(2, 4]  3.500000
# group_6.apply(function_name) # 对分组对象应用自定义函数
# 练习: 对df6按k3分组后,求每组中k2列的最大值和最小值
# 要求利用 apply 函数回家再做

原文地址:https://www.cnblogs.com/PYlog/p/9146253.html

时间: 2024-11-10 15:16:06

DataFrame基本操作 <三> 计算名次,移除重复数据,数据替换,划分区间,分组统计(变成类)的相关文章

OSX的三指拖移功能隐藏的太深了!

今天买了个新MacBook,结果设置三指拖移时,找不到地方了,google后,才发现答案: 开启适用于 Force Touch 触控板的"三指拖移" "三指拖移"是 OS X 中的一种 Multi-Touch 手势.通过这个手势,您能使用三个手指移动屏幕上的活跃窗口. 本文介绍了在您的 Mac 配备了 Force Touch 触控板的情况下,该如何开启"三指拖移". 从 Apple 菜单中,选取"系统偏好设置". 点按&quo

从一个未排序的链表中移除重复项

问题 从一个未排序的链表中移除重复的项? 附, 如果不允许使用临时的缓存,你如何解决这个问题? 分析 如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况. 对于这种情况,最好的解决方法当然是使用哈希表,但令人非常不爽的是C++标准里是没有 哈希表的(java里有).网上有人用ext下的hash_map,但毕竟不是C++标准里的, 用起来怪怪的,搞不好换个环境就跑不起来了(像Linux和Windows下使用就不一样). 所以,一般用一个数组模拟一下就好了.但,这里要注意一个问题,

【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变

问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决. 2.如果序列时不可哈希的,想要去除重复项,需要对上述代码稍作修改: key参数的作用是指定一个函数用来将序列中的元素转化为可哈希的类型,如此可以检测重复项.

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 2 qwe asd 样例输出 e q w a d s #include <iostream> using namespace

[LeetCode] Remove Duplicate Letters 移除重复字母

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example: Given "bcabc&q

18 如何从一个数组中移除重复的元素

两种方法 (1) 使用LINQ (2) 使用List static void RemoveDups(string[] myStringArray) { // LINQ string[] str = myStringArray.Distinct().ToArray(); // Array to List to Array List<String> myStringList = new List<string>(); foreach (string s in myStringArray

计算名次

构造一个新数组,将对应位置的数字,从大到小或从小到大排序的名次存储,并输出 //计算名次 #include<iostream> #include<cstring> using namespace std; int book[101]; void rank(int *a,int n,int book[]){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) if(a[j]<a[i]) book[i]++; // else book

移除重复节点

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12684896.html 移除重复节点(148min) 题目链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/ 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]提示: 链表长度在[0, 20000]范围内.链表元素在[0, 20000]

hadoop之魂--mapreduce计算框架,让收集的数据产生价值 (第4篇)

  通过前面的学习,大家已经了解了HDFS文件系统.有了数据,下一步就要分析计算这些数据,产生价值.接下来我们介绍Mapreduce计算框架,学习数据是怎样被利用的. Mapreduce计算框架 如果将Hadoop比做一头大象,那么MapReduce就是那头大象的电脑.MapReduce是Hadoop核心编程模型.在Hadoop中,数据处理核心就是MapReduce程序设计模型. 本章内容: 1) MapReduce编程模型 2) MapReduce执行流程 3) MapReduce数据本地化