本文的目的是介绍Pandas数据框比较和浮点精度的详细情况,特别关注pandas浮点数精度的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Pandas数据框比较和浮点
本文的目的是介绍Pandas数据框比较和浮点精度的详细情况,特别关注pandas 浮点数精度的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解Pandas数据框比较和浮点精度的机会,同时也不会遗漏关于Numpy isnan()在浮点数组上失败(适用于pandas数据框)、Pandas数据分析-pandas数据框的多层索引、pandas数据框中的圆柱、Pandas数据框到Spark数据框,是否将NaN转换为实际的null?的知识。
本文目录一览:- Pandas数据框比较和浮点精度(pandas 浮点数精度)
- Numpy isnan()在浮点数组上失败(适用于pandas数据框)
- Pandas数据分析-pandas数据框的多层索引
- pandas数据框中的圆柱
- Pandas数据框到Spark数据框,是否将NaN转换为实际的null?
Pandas数据框比较和浮点精度(pandas 浮点数精度)
我正在寻找比较应该相同的两个数据框。但是,由于浮点精度,我被告知值不匹配。我在下面创建了一个示例进行模拟。如何获得正确的结果,以便最终比较数据帧对两个单元格都返回true?
a = pd.DataFrame({''A'':[100,97.35000000001]})b = pd.DataFrame({''A'':[100,97.34999999999]})print a A 0 100.00 1 97.35print b A 0 100.00 1 97.35print (a == b) A 0 True 1 False
答案1
小编典典好的,您可以np.isclose
为此使用:
In [250]:np.isclose(a,b)Out[250]:array([[ True], [ True]], dtype=bool)
np.isclose
需要相对公差和绝对公差。这些有默认值:rtol=1e-05
,atol=1e-08
分别
Numpy isnan()在浮点数组上失败(适用于pandas数据框)
我有一个浮点数数组(一些正常数字,一些nans),它们是从对熊猫数据框的应用中得出的。
由于某种原因,numpy.isnan在此数组上失败,但是如下所示,每个元素都是浮点数,numpy.isnan在每个元素上正确运行,变量的类型肯定是numpy数组。
这是怎么回事?!
set([type(x) for x in tester])Out[59]: {float}testerOut[60]: array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan], dtype=object)set([type(x) for x in tester])Out[61]: {float}np.isnan(tester)Traceback (most recent call last):File "<ipython-input-62-e3638605b43c>", line 1, in <module>np.isnan(tester)TypeError: ufunc ''isnan'' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''''safe''''set([np.isnan(x) for x in tester])Out[65]: {False, True}type(tester)Out[66]: numpy.ndarray
答案1
小编典典np.isnan
可以应用于本机dtype的NumPy数组(例如np.float64):
In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))Out[99]: array([ True, False], dtype=bool)
但是在应用于对象数组时引发TypeError:
In [96]: np.isnan(np.array([np.nan, 0], dtype=object))TypeError: ufunc ''isnan'' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''''safe''''
由于您拥有Pandas,pd.isnull
因此可以改用-它可以接受对象或本机dtypes的NumPy数组:
In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))Out[97]: array([ True, False], dtype=bool)In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))Out[98]: array([ True, False], dtype=bool)
请注意,None
在对象数组中也将其视为空值。
Pandas数据分析-pandas数据框的多层索引
前言
pandas数据框针对高维数据,也有多层索引的办法去应对。多层数据一般长这个样子
可以看到AB两大列,下面又有xy两小列。 行有abc三行,又分为onetwo两小行。
在分组聚合的时候也会产生多层索引,下面演示一下。
导入包和数据:
import numpy as np import pandas as pd df=pd.read_excel(''team.xlsx'')
分组聚合:
df.groupby([''team'',df.mean(1)>60]).count() #每组平均分大于60的人的个数
可以看到分为abcde五组,平均分大于60 的组员两小行。
创建多层索引
#序列中创建 arrays = [[1, 1, 2, 2], [''red'', ''blue'', ''red'', ''blue'']] index=pd.MultiIndex.from_arrays(arrays, names=(''number'', ''color'')) index
pd.DataFrame([{''a'':1, ''b'':2}], index=index)
#来自元组创建 arrays = [[''bar'', ''bar'', ''baz'', ''baz'', ''foo'', ''foo'', ''qux'', ''qux''], [''one'', ''two'', ''one'', ''two'', ''one'', ''two'', ''one'', ''two'']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=[''first'', ''second'']) pd.Series(np.random.randn(8), index=index)
#可迭代对象的笛卡尔积,排列组合各种情况 numbers = [0, 1, 2] colors = [''green'', ''purple''] index = pd.MultiIndex.from_product([numbers, colors],names=[''number'', ''color'']) pd.Series(np.random.randn(6), index=index)
#来自 DataFrame df = pd.DataFrame([[''bar'', ''one''], [''bar'', ''two''], [''foo'', ''one''], [''foo'', ''two'']], columns=[''first'', ''second'']) '''''' first second 0 bar one 1 bar two 2 foo one 3 foo two '''''' index = pd.MultiIndex.from_frame(df) pd.Series(np.random.randn(4), index=index)
多层索引操作
index_arrays = [[1, 1, 2, 2], [''男'', ''女'', ''男'', ''女'']] columns_arrays = [[''2020'', ''2020'', ''2021'', ''2021''], [''上半年'', ''下半年'', ''上半年'', ''下半年'',]] index = pd.MultiIndex.from_arrays(index_arrays,names=(''班级'', ''性别'')) columns = pd.MultiIndex.from_arrays(columns_arrays,names=(''年份'', ''学期'')) df = pd.DataFrame([(88,99,88,99),(77,88,97,98), (67,89,54,78),(34,67,89,54)],columns=columns, index=index) df
索引名称的查看
#索引名称的查看: df.index # 索引, 是一个 MultiIndex df.columns # 引索引,也是一个 MultiIndex # 查看行索引的名称 df.index.names # FrozenList([''班级'', ''性别'']) # 查看列索引的名称 df.columns.names # FrozenList([''年份'', ''学期''])
索引的层级
#索引的层级: df.index.nlevels # 层级数 2 df.index.levels # 行的层级 # FrozenList([[1, 2], [''女'', ''男'']]) df.columns.levels # 列的层级 # FrozenList([[''2020'', ''2021''], [''上半年'', ''下半年'']]) df[[''2020'',''2021'']].index.levels # 筛选后的层级 # FrozenList([[1, 2], [''女'', ''男'']])
索引内容的查看
#索引内容的查看: # 获取索引第2层内容 df.index.get_level_values(1) # Index([''男'', ''女'', ''男'', ''女''], dtype=''object'', name=''性别'') # 获取列索引第1层内容 df.columns.get_level_values(0) # Index([''2020'', ''2020'', ''2021'', ''2021''], dtype=''object'', name=''年份'') # 按索引名称取索引内容 df.index.get_level_values(''班级'') # Int64Index([1, 1, 2, 2], dtype=''int64'', name=''班级'') df.columns.get_level_values(''年份'') # Index([''2020'', ''2020'', ''2021'', ''2021''], dtype=''object'', name=''年份'') # 多层索引的数据类型,1.3.0+ df.index.dtypes
#排序
# 使用索引名可进行排序,可以指定具体的列 df.sort_values(by=[''性别'', (''2020'',''下半年'')]) df.index.reorder_levels([1,0]) # 等级顺序,互换 df.index.set_codes([1, 1, 0, 0], level=''班级'') # 设置顺序 df.index.sortlevel(level=0, ascending=True) # 按指定级别排序 df.index.reindex(df.index[::-1]) # 更换顺序,或者指定一个顺序
相关操作转换:
df.index.to_numpy() # 生成一个笛卡尔积的元组对列表 # array([(1, ''男''), (1, ''女''), (2, ''男''), (2, ''女'')], dtype=object) df.index.remove_unused_levels() # 返回没有使用的层级 df.swaplevel(0, 2) # 交换索引 df.to_frame() # 转为 DataFrame idx.set_levels([''a'', ''b''], level=''bar'') # 设置新的索引内容 idx.set_levels([[''a'', ''b'', ''c''], [1, 2, 3, 4]], level=[0, 1]) idx.to_flat_index() # 转为元组对列表 df.index.droplevel(0) # 删除指定等级 df.index.get_locs((2, ''女'')) # 返回索引的位置
数据查询
#查询指定行 df.loc[1] #一班的 df.loc[(1, ''男'')] # 一年级男 df.loc[1:2] # 一二两年级数据
#查询指定列 df[''2020''] # 整个一级索引下 df[(''2020'',''上半年'')] # 指定二级索引 df[''2020''][''上半年''] # 同上
#行列综合 slice(None)表示本层所有内容 df.loc[(1, ''男''), ''2020''] # 只显示2020年一年级男 df.loc[:, (slice(None), ''下半年'')] # 只看下半年的 df.loc[(slice(None), ''女''),:] # 只看女生 df.loc[1, (slice(None)),:] # 只看1班 df.loc[:, (''2020'', slice(None))] # 只看 2020 年的
#查询指定条件
#和单层索引的数据查询一样,不过在选择列上要按多层的规则。 df[df[(''2020'',''上半年'')] > 80]
#pd.IndexSlice切片使用: idx = pd.IndexSlice idx[0] # 0 idx[:] # slice(None, None, None) idx[0,''x''] # (0, ''x'') idx[0:3] # slice(0, 3, None) idx[0.1:1.5] # slice(0.1, 1.5, None) idx[0:5,''x'':''y''] # (slice(0, 5, None), slice(''x'', ''y'', None))
#查询应用: idx = pd.IndexSlice df.loc[idx[:,[''男'']],:] # 只显示男 df.loc[:,idx[:,[''上半年'']]] # 只显示上半年 #df.xs() df.xs((1, ''男'')) # 一年级男生 df.xs(''2020'', axis=1) # 2020 年 df.xs(''男'', level=1) # 所有男生
数据分组
df.groupby(level=0).sum() df.groupby(level=''性别'').sum() df.sum(level=''班级'') # 也可以直接统计
df.groupby(level=[''性别'', ''班级'']).sum()
到此这篇关于Pandas数据分析-andas数据框的多层索引的文章就介绍到这了,更多相关pandas多层索引内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- Pandas将列表(List)转换为数据框(Dataframe)
- Pandas 数据框增、删、改、查、去重、抽样基本操作方法
- pandas数据框,统计某列数据对应的个数方法
- python pandas创建多层索引MultiIndex的6种方式
- Pandas的MultiIndex多层索引使用说明
- pandas多层索引的创建和取值以及排序的实现
- 在Pandas中给多层索引降级的方法
pandas数据框中的圆柱
我有以下pandas数据框
Y X id WP_NER
0 35.973496 -2.734554 1 WP_01
1 35.592138 -2.903913 2 WP_02
2 35.329853 -3.391070 3 WP_03
3 35.392608 -3.928513 4 WP_04
4 35.579265 -3.942995 5 WP_05
5 35.519728 -3.408771 6 WP_06
6 35.759485 -3.078903 7 WP_07
我想用pandas四舍五入Y和X列。我怎样才能做到这一点 ?
Pandas数据框到Spark数据框,是否将NaN转换为实际的null?
我想将数据框从熊猫转换为Spark,并且正在使用spark_context.createDataFrame()
创建数据框的方法。我还在方法中指定了架构createDataFrame()
。
我想知道的是如何处理特殊情况。例如,当转换为Spark数据帧时,熊猫中的 NaN 最终为字符串“
NaN”。我正在寻找如何获取实际的空值而不是“ NaN”的方法。
答案1
小编典典TL; DR 现在最好的选择是完全跳过熊猫。
问题的根源是熊猫不如Spark SQL富有表现力。Spark提供NULL
(从SQL的意义上说是缺失值)和NaN
(数字不是数字)。
另一只手的熊猫没有可用于表示缺失值的本机值。因此,它使用占位符(例如NaN
/NaT
或)Inf
,这些占位符与Spark的实际区别不大NaNs
,Infs
并且转换规则取决于列类型。唯一的例外是object
可以包含None
值的列(通常是字符串)。您可以从文档中了解有关处理缺失值的更多信息。
例如,当转换为Spark数据帧时,熊猫中的NaN最终为字符串“ NaN”。
这实际上是不正确的。取决于输入列的类型。如果column显示NaN
它很可能不是数字值,则不是纯字符串:
from pyspark.sql.functions import isnan, isnullpdf = pd.DataFrame({ "x": [1, None], "y": [None, "foo"], "z": [pd.Timestamp("20120101"), pd.Timestamp("NaT")]})sdf = spark.createDataFrame(pdf)sdf.show()+---+----+-------------------+| x| y| z|+---+----+-------------------+|1.0|null|2012-01-01 00:00:00||NaN| foo| null|+---+----+-------------------+sdf.select([ f(c) for c in sdf.columns for f in [isnan, isnull] if (f, c) != (isnan, "z") # isnan cannot be applied to timestamp ]).show()+--------+-----------+--------+-----------+-----------+|isnan(x)|(x IS NULL)|isnan(y)|(y IS NULL)|(z IS NULL)|+--------+-----------+--------+-----------+-----------+| false| false| false| true| false|| true| false| false| false| true|+--------+-----------+--------+-----------+-----------+
实际上,并行化的本地集合(包括Pandas对象)在简单的测试和玩具示例之外的重要性可以忽略不计,因此您始终可以手动转换数据(跳过可能的Arrow优化):
import numpy as npspark.createDataFrame([ tuple( None if isinstance(x, (float, int)) and np.isnan(x) else x for x in record.tolist()) for record in pdf.to_records(index=False)], pdf.columns.tolist()).show()+----+----+-------------------+| x| y| z|+----+----+-------------------+| 1.0|null|1325376000000000000||null| foo| null|+----+----+-------------------+
如果缺少/不是数字的歧义不是问题,那么只需照常加载数据并替换为Spark。
from pyspark.sql.functions import col, whensdf.select([ when(~isnan(c), col(c)).alias(c) if t in ("double", "float") else c for c, t in sdf.dtypes]).show()+----+----+-------------------+| x| y| z|+----+----+-------------------+| 1.0|null|2012-01-01 00:00:00||null| foo| null|+----+----+-------------------+
今天关于Pandas数据框比较和浮点精度和pandas 浮点数精度的讲解已经结束,谢谢您的阅读,如果想了解更多关于Numpy isnan()在浮点数组上失败(适用于pandas数据框)、Pandas数据分析-pandas数据框的多层索引、pandas数据框中的圆柱、Pandas数据框到Spark数据框,是否将NaN转换为实际的null?的相关知识,请在本站搜索。
本文标签: