【DataFrame】【翻译】⼀起来读官⽅⽂档
pandas dataframe ⽂档阅读笔记。
dataframe是⼀个2维的有标签数据结构,它每⼀列元素可以是不同的类型。
可以通过⾏索引或者是列索引对数据进⾏索引,DataFrame结构的⾏索引称为index,纵索引称为columns。
可以通过 df.index、df.columns返回df的索引。
可以将dict结构数据转化为DataFrame结构,默认情况下,dict中的keys对应dataframe中的columns。那么index值该怎么办呢?
假设没有对index指定,那么index默认为range(n)
可以在转换时通过index参数对其设定:
In [44]: d = {"one": [1.0, 2.0, 3.0, 4.0], "two": [4.0, 3.0, 2.0, 1.0]}
In [45]: pd.DataFrame(d)
Out[45]:
one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0
In [46]: pd.DataFrame(d, index=["a", "b", "c", "d"])
Out[46]:
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
np.nan 表⽰缺失值
group by⽂档翻译:
Group by : 拆分-应⽤-组合
"group by"使⽤场景,如下所⽰:
1. 拆分:根据某些标准将数据分组。
2. 应⽤:对每个组的数据分别应⽤某个函数。
3. 汇合:将所有的结果组合,汇总。
其中,最直接的步骤是 1.拆分 步骤。⼀般情况下,我们希望将数据集分组,并对不同的组进⾏操作。在使⽤过程中,我们可以进⾏以下操作:
聚合:计算每个组的统计量,例如:
计算每组数据的求和,均值
计算每个组的⼤⼩
转换:执⾏针对于组的计算,并返回⼀个类似索引的对象,例如:
标准化组内的数据
⽤每个组派⽣的值填充组内的空值(NA)
过滤:根据筛选规则对每个组进⾏筛选,丢弃不满⾜要求的数据组,例如:
删除只有少量数据的⼀组数据。
根据组的和或者是组的均值来筛选数据组
以上三种操作的组合:GroupBy will examine the results of the apply step and try to return a sensibly combined result if it doesn’t fit into either of the above two categories.
我们希望在每个数据组中调⽤函数,⽽⾮整个数据集。所以此处的思想与SQL中的GroupBy是相同的,我们希望你可以在python中编写类似下列代码的处理⽅式:
SELECT Column1, Column2, mean(Column3), sum(Column4)
FROM SomeTable
GROUP BY Column1, Column2
我们的⽬标就是pandas⾃然的实现上述功能。我们将在各个领域使⽤pandas,通过⼀些⽰例展⽰其使⽤⽅法。
See the for some advanced strategies.在可以看到⾼级使⽤⽅法。
groupby是什么函数将对象拆分成组
pandas可以在它的任何维度上拆分。对分组抽象的定义提供了⼀种从标签到组名的映射关系。将⼀个进⾏分组,可以有以下操作:
In [1]: df = pd.DataFrame(
...: [
...: ("bird", "Falconiformes", 389.0),
...: ("bird", "Psittaciformes", 24.0),
...: ("mammal", "Carnivora", 80.2),
...: ("mammal", "Primates", np.nan),
...: ("mammal", "Carnivora", 58),
...: ],
...: index=["falcon", "parrot", "lion", "monkey", "leopard"], #指定索引名称
...: columns=("class", "order", "max_speed"), #指定列名
...: )
...:
In [2]: df
Out[2]:
class order max_speed
falcon bird Falconiformes 389.0
parrot bird Psittaciformes 24.0
lion mammal Carnivora 80.2
monkey mammal Primates NaN
leopard mammal Carnivora 58.0
# default is axis=0
In [3]: grouped = df.groupby("class")
In [4]: grouped = df.groupby("order", axis="columns")
In [5]: grouped = df.groupby(["class", "order"])
在此处原⽂有⼀句这样的话,
default is axis=0
这句话的意思是默认axis=0
那么axis=0指的是什么呢?
axis=0代表⾏操作
axis=1代表列操作
pandas对关键字axis关键字的⽤法保持了NumPy的⽤法:
轴⽤来为超过⼀维的数组定义的属性,⼆维数据拥有两个轴:第0轴沿着⾏的垂直往下,第1轴沿着列的⽅向⽔平延伸。
详细内容可以看
这个映射关系可以通过很多⽅式进⾏定义:
设定⼀个函数,对每⼀个axis的label进⾏操作
与所选axis长度的list或者是ndarray
dict series 提供label->group name 的映射
对于 DataFrame 对象,使⽤⼀个字符串,指⽰要⽤于分组的列名称或索引级别名称。
上述的组合
我们将分组对象统称为keys。例如:
注意:
使⽤groupby分组的对象可以是column或者是index。如果该字符串与column的名字或者是index的名字相同,会引发 ValueError
import numpy as np
import pandas as pd
df = pd.DataFrame(
{
"A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
"B": ["one", "one", "two", "three", "two", "two", "one", "three"],
"C": np.random.randn(8),
"D": np.random.randn(8),
}
)
In [7]: df
Out[7]:
A B C D
0 foo one 0.469112 -0.861849
1 bar one -0.282863 -2.104569
2 foo two -1.509059 -0.494929
3 bar three -1.135632 1.071804
4 foo two 1.212112 0.721555
5 bar two -0.173215 -0.706771
6 foo one 0.119209 -1.039575
7 foo three -1.044236 0.271860
在 DataFrame 上,我们通过调⽤ groupby() 获得⼀个 GroupBy 对象。 我们可以⾃然地按 A 或 B 列或两者分组:In [8]: grouped = df.groupby("A")
In [9]: grouped = df.groupby(["A", "B"])
值得注意的是,⽂档中在这⾥没有给出输出,这是为什么呢?
当我们运⾏下列代码:
grouped = df.groupby("A")
grouped
会出现什么呢?
&ic.DataFrameGroupBy object at 0x000002513E65C148>
在运⾏groupby之后返回的并不是⼀个DataFrame⽽是DataFrameGroupBy的类型。先继续往下学。
如果我们使⽤ A 和 B 进⾏混合索引,我们可以按除指定列之外的所有列进⾏分组
df2 = df.set_index(["A", "B"])
其结果为
C D
A B
foo one-1.364198-1.301873
bar one0.307794 1.131311
foo two-1.2572460.180205
bar three 1.098357-0.365122
foo two-0.148174-0.256075
bar two-0.813338 1.148187
one-0.182445-1.364987
foo
three-0.890469-2.045356
In [11]: grouped = upby(level=df2.index.names.difference(["B"]))
In [12]: grouped.sum()
Out[12]:
C D
A
bar -1.591710 -1.739537
foo -0.752861 -1.402938
上⾯的groupby操作 都是 在其index(⾏)上拆分 DataFrame。 我们也可以按列columns拆分:
In [13]: def get_letter_type(letter):
....: if letter.lower() in 'aeiou':
....: return 'vowel'
....: else:
....: return 'consonant'
In [14]: grouped = df.groupby(get_letter_type, axis=1)
pandas 索引对象⽀持重复值。 如果在 groupby 操作中使⽤⾮唯⼀索引作为组键,则同⼀索引值的所有值都将被视为在⼀个组中,因此聚合函数的输出将仅包含唯⼀索引值:
In [15]: lst = [1, 2, 3, 1, 2, 3]
In [16]: s = pd.Series([1, 2, 3, 10, 20, 30], lst)
In [17]: grouped = s.groupby(level=0)
In [18]: grouped.first()
Out[18]:
1 1
2 2
3 3
dtype: int64
In [19]: grouped.last()
Out[19]:
1 10
2 20
3 30
dtype: int64
In [20]: grouped.sum()
Out[20]:
1 11
2 22
3 33
dtype: int64
注意:
在需要使⽤该操作的结果前数据没有被操作。 创建 GroupBy 对象只会验证您是否传递了有效的映射。
许多复杂的数据操作都可以⽤ GroupBy 操作来表达(虽然不能保证是最有效的)。 您可以使⽤标签映射功能变得⾮常有创意。
分组排序
默认情况下,在 groupby 操作期间对group keys 进⾏排序。 但是,您可以通过 sort=False 来改变默认的排序规则(降序):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论