本文的目的是介绍与PythonPandas融化相反的详细情况,特别关注python与pandas关系的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解与PythonPa
本文的目的是介绍与Python Pandas融化相反的详细情况,特别关注python与pandas关系的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解与Python Pandas融化相反的机会,同时也不会遗漏关于/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: pandas 处理 NaN、PANDAS中类似SQL的窗口函数:Python Pandas Dataframe中的行编号、Pandas的10大惊人应用-哪个行业领域正在使用Python Pandas?、Pandas融化了多个价值变量的知识。
本文目录一览:- 与Python Pandas融化相反(python与pandas关系)
- /opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: pandas 处理 NaN
- PANDAS中类似SQL的窗口函数:Python Pandas Dataframe中的行编号
- Pandas的10大惊人应用-哪个行业领域正在使用Python Pandas?
- Pandas融化了多个价值变量
与Python Pandas融化相反(python与pandas关系)
我无法弄清楚如何使用python中的Pandas进行“反向融化”。这是我的起始数据
import pandas as pdfrom StringIO import StringIOorigin = pd.read_table(StringIO(''''''label type valuex a 1x b 2x c 3y a 4y b 5y c 6z a 7z b 8z c 9''''''))originOut[5]: label type value0 x a 11 x b 22 x c 33 y a 44 y b 55 y c 66 z a 77 z b 88 z c 9
这是我想要的输出:
label a b c x 1 2 3 y 4 5 6 z 7 8 9
我敢肯定有一个简单的方法可以做到这一点,但是我不知道怎么做。
答案1
小编典典有几种方法;
使用.pivot
:
>>> origin.pivot(index=''label'', columns=''type'')[''value'']type a b clabel x 1 2 3y 4 5 6z 7 8 9[3 rows x 3 columns]
使用pivot_table
:
>>> origin.pivot_table(values=''value'', index=''label'', columns=''type'') value type a b clabel x 1 2 3y 4 5 6z 7 8 9[3 rows x 3 columns]
或.groupby
后跟.unstack
:
>>> origin.groupby([''label'', ''type''])[''value''].aggregate(''mean'').unstack()type a b clabel x 1 2 3y 4 5 6z 7 8 9[3 rows x 3 columns]
/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: pandas 处理 NaN
这里记录一下犯过的及其傻帽的错误!!!!哈哈,无语,同时讨论一下NaN这个数据类型的处理
/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: FutureWarning: elementwise comparison Failed; returning scalar instead,but in the future will perform elementwise comparison result = getattr(x,name)(y)
....................
TypeError: invalid type comparison
这里有一个优惠券的scv表:
import numpy as np
import pandas as pd
dfoff = pd.read_csv("datalab/4901/ccf_offline_stage1_train.csv")
dfofftest = pd.read_csv("datalab/4901/ccf_offline_stage1_test_revised.csv")
dfoff.head()
笔者这里的目的是想统计出 Coupon_id是非NaN(非空)且Date是NaN(空)的用户数(行数)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
一般来说比如我们想筛选出 discount_rate是20:1且distance不是1.0的行数可以这么做:
dfoff.info()
print('数目是:',dfoff[(dfoff['discount_rate']=='20:1')&(dfoff['Date']!=1.0)].shape[0])
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
于是笔者这样做了筛选:
dfoff.info()
print('有优惠券,但是没有使用优惠券购买的客户有',dfoff[(dfoff['Coupon_id']!='NaN')&(dfoff['Date']=='NaN')].shape[0])
结果报错:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1754884 entries,0 to 1754883
Data columns (total 7 columns):
User_id int64
Merchant_id int64
Coupon_id float64
discount_rate object
distance float64
Date_received float64
Date float64
dtypes: float64(4),int64(2),object(1)
memory usage: 93.7+ MB
/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: FutureWarning: elementwise comparison Failed; returning scalar instead,but in the future will perform elementwise comparison
result = getattr(x,name)(y)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-24-c27c94978405> in <module>()
1 dfoff.info()
----> 2 print('有优惠券,但是没有使用优惠券购买的客户有',dfoff[(dfoff['Coupon_id']!='NaN')&(dfoff['Date']=='NaN')].shape[0])
/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py in wrapper(self,other,axis)
877
878 with np.errstate(all='ignore'):
--> 879 res = na_op(values,other)
880 if is_scalar(res):
881 raise TypeError('Could not compare {typ} type with Series'
/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py in na_op(x,y)
816 result = getattr(x,name)(y)
817 if result is NotImplemented:
--> 818 raise TypeError("invalid type comparison")
819 except AttributeError:
820 result = op(x,y)
TypeError: invalid type comparison
其实吧原因很简单,注意看上面笔者故意标红的地方,Coupon_id 和Date的数据类型都是float64,而代码中却用了dfoff['Coupon_id']!='NaN',这不是字符串嘛!!!!!!
print(type('NaN'))
<class 'str'>
float和str比较当然报错了是吧,哎!能这样直接去比较我也算是极品啦哈哈哈
于是可以使用其内置的方法解决:
dfoff.info()
print('有优惠券,但是没有使用优惠券购买的客户有',dfoff[(dfoff['Coupon_id'].notnull())&(dfoff['Date'].isnull())].shape[0])
即使用了如下两个方法
.notnull()
.isnull()
其作用就是判断是否是空值,如果csv中的NaN的地方换成null同样适用
同时这里说一下怎么将NaN替换掉:例如替换成0.0
dfoff['Coupon_id']=dfoff['Coupon_id'].replace(np.nan,0.0)
-----------------------------------------------------------------------------------------------------------------------------------------------------------
下面来说一下NaN这个数据类型,它的全称应该是not a number,说到这里不得不提到另外一个数据类型inf
相同点:都是代表一个无法表示的数
不同点:inf代表无穷大,是一个超过浮点表示范围的浮点数,而NaN可以看成是缺少值或者是无理数
假设现在有一段程序:
def ConvertRate(row):
if row.isnull():
return 0
elif ':' in str(row):
rows = str(row).split(':')
return 1.0-float(rows[1])/float(rows[0])
else:
return float(row)
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
print(dfoff.head(3))
会发现报错:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-0aa06185ee75> in <module>()
7 else:
8 return float(row)
----> 9 dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
10 print(dfoff.head(3))
/opt/conda/lib/python3.6/site-packages/pandas/core/series.py in apply(self,func,convert_dtype,args,**kwds)
2549 else:
2550 values = self.asobject
-> 2551 mapped = lib.map_infer(values,f,convert=convert_dtype)
2552
2553 if len(mapped) and isinstance(mapped[0],Series):
pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer()
<ipython-input-3-0aa06185ee75> in ConvertRate(row)
1 def ConvertRate(row):
----> 2 if row.isnull():
3 return 0
4 elif ':' in str(row):
5 rows = str(row).split(':')
AttributeError: 'float' object has no attribute 'isnull'
那它到底是什么数据类型呢?
print(type(np.nan))
print(type(np.inf))
<class 'float'>
<class 'float'>
NaN'就是表示一个普通的字符串,而np.nan就是代表真真的nan,那我们可不可以使用这样:
def ConvertRate(row):
if row==np.nan:
return 0
elif ':' in str(row):
rows = str(row).split(':')
return 1.0-float(rows[1])/float(rows[0])
else:
return float(row)
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
print(dfoff.head(3))
User_id Merchant_id Coupon_id discount_rate distance Date_received \
0 1439408 2632 NaN NaN 0.0 NaN
1 1439408 4663 11002.0 150:20 1.0 20160528.0
2 1439408 2632 8591.0 20:1 0.0 20160217.0
Date discount_rate
0 20160217.0 NaN
1 NaN 0.866667
2 NaN 0.950000
可以看到这里还是NaN,并不是0,说明还是不对
那试一下:
def ConvertRate(row):
if row==float('NaN'):
return 0
elif ':' in str(row):
rows = str(row).split(':')
return 1.0-float(rows[1])/float(rows[0])
else:
return float(row)
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
print(dfoff.head(3))
结果还是如上面,其实NaN数据类型就是一种特殊的float,这里相当于强制类型转化
那到底怎么办呢?其实判断是否是NaN可以使用如下方法:
row!=row
如果结果是真,那么就是NaN,假就代表不是NaN
可以看一下结果:
def ConvertRate(row):
if row!=row:
return 0
elif ':' in str(row):
rows = str(row).split(':')
return 1.0-float(rows[1])/float(rows[0])
else:
return float(row)
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
print(dfoff.head(3))
print(dfoff.head(3))
User_id Merchant_id Coupon_id discount_rate distance Date_received \
0 1439408 2632 NaN NaN 0.0 NaN
1 1439408 4663 11002.0 150:20 1.0 20160528.0
2 1439408 2632 8591.0 20:1 0.0 20160217.0
Date discount_rate
0 20160217.0 0.000000
1 NaN 0.866667
2 NaN 0.950000
于是笔者最开始的那个问题也可以这样解决:
print('有优惠券,但是没有使用优惠券购买的客户有',dfoff[(dfoff['Coupon_id']==dfoff['Coupon_id'])&(dfoff['Date']!=dfoff['Date'])].shape[0])
有优惠券,但是没有使用优惠券购买的客户有 977900
---------------------------------------------------------------------------------------------------------------------------------------------------------------
有时候在使用apply的时候会报错,所以最好加一下:axis = 1意思是按列处理的
对应到上面就是吧:
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate)
改为:
dfoff['discount_rate'] = dfoff['discount_rate'].apply(ConvertRate,axis = 1)
------------------------------------------------------------------------------------------------------------------------------------------------------------
所以最后总结一下:
NaN和inf都是一种特殊的float数据类型
可以使用row!=row类似的形式来判断是否是NaN,如果是真就代表是NaN,假就代表不是NaN,换句话说也可以使用row==row来判断是否是NaN,只不过逻辑相反而已
报错记得加axis = 1
------------------------------------------------------------------------------------------------------------------------------------------------------
在使用pands加载数据的时候,其实我们是可以控制数据类型的,比如让缺省值变为null,而不是NAN,即让字段的数据类型不再是float,而是object,这里有一个例子:https://blog.csdn.net/weixin_42001089/article/details/85013073
PANDAS中类似SQL的窗口函数:Python Pandas Dataframe中的行编号
我来自sql背景,并且经常使用以下数据处理步骤:
- 按一个或多个字段对数据表进行分区
- 对于每个分区,在其每一行中添加一个行号,以行的一个或多个其他字段对行进行排名,分析人员在其中指定升序或降序
例如:
df = pd.DataFrame({''key1'' : [''a'',''a'',''a'',''b'',''a''], ''data1'' : [1,2,2,3,3], ''data2'' : [1,10,2,3,30]})df data1 data2 key1 0 1 1 a 1 2 10 a 2 2 2 a 3 3 3 b 4 3 30 a
我正在寻找如何执行相当于此sql窗口函数的PANDAS:
RN = ROW_NUMBER() OVER (PARTITION BY Key1 ORDER BY Data1 ASC, Data2 DESC) data1 data2 key1 RN0 1 1 a 1 1 2 10 a 2 2 2 2 a 33 3 3 b 14 3 30 a 4
我尝试了以下在没有“分区”的情况下必须工作的方法:
def row_number(frame,orderby_columns, orderby_direction,name): frame.sort_index(by = orderby_columns, ascending = orderby_direction, inplace = True) frame[name] = list(xrange(len(frame.index)))
我试图将这个想法扩展到可以使用分区(熊猫中的组),但是以下操作不起作用:
df1 = df.groupby(''key1'').apply(lambda t: t.sort_index(by=[''data1'', ''data2''], ascending=[True, False], inplace = True)).reset_index()def nf(x): x[''rn''] = list(xrange(len(x.index)))df1[''rn1''] = df1.groupby(''key1'').apply(nf)
但是当我这样做时,我得到了很多NaN。
理想情况下,有一种简洁的方法可以复制sql的窗口函数功能(我已经弄清楚了基于窗口的聚合……这是熊猫的一个内衬)……有人可以和我分享最惯用的方法吗?在PANDAS中编号这样的行?
答案1
小编典典您可以通过groupby
与rank
方法一起使用两次来做到这一点:
In [11]: g = df.groupby(''key1'')
使用min方法参数为共享相同RN的相同数据的值赋值:
In [12]: g[''data1''].rank(method=''min'')Out[12]:0 11 22 23 14 4dtype: float64In [13]: df[''RN''] = g[''data1''].rank(method=''min'')
然后对这些结果进行分组,并添加关于data2的排名:
In [14]: g1 = df.groupby([''key1'', ''RN''])In [15]: g1[''data2''].rank(ascending=False) - 1Out[15]:0 01 02 13 04 0dtype: float64In [16]: df[''RN''] += g1[''data2''].rank(ascending=False) - 1In [17]: dfOut[17]: data1 data2 key1 RN0 1 1 a 11 2 10 a 22 2 2 a 33 3 3 b 14 3 30 a 4
感觉应该有一种本机的方法可以做到这一点(可能有!!)。
Pandas的10大惊人应用-哪个行业领域正在使用Python Pandas?
对一个知识该如何准确地运用一个知识有一个扎实的想法是很重要的,因为知识很容易获得,但是正确使用它才是使您明智的。因此,在《熊猫的十大惊人应用》中,我们选择了令人鼓舞的应用程序以及可以在现实世界中应用熊猫知识的各个位置。
借助此列表,您将了解在现实世界中哪些行业应用Python熊猫。
1.经济学
经济学对数据分析的需求不断。对于经济学家来说,分析数据以形成模式并了解有关各个部门经济增长方式的趋势是非常重要的。因此,许多经济学家已经开始使用Python和Pandas分析庞大的数据集。熊猫提供了一套全面的工具,例如数据框架和文件处理。这些工具极大地帮助访问和处理数据以获得所需的结果。通过熊猫的这些应用,世界各地的经济学家都能够取得前所未有的突破。
2.推荐系统
我们都使用了Spotify或Netflix,这些网站提供的出色建议令他们感到震惊。这些系统是深度学习的 奇迹。这种提供建议的模型是熊猫最重要的应用之一。通常,这些模型是用python创建的,而Pandas是python的主要库,在处理此类模型中的数据时会使用它们。我们知道,熊猫最适合管理大量数据。推荐系统只有通过学习和处理大量数据才有可能。诸如groupBy和映射之类的功能极大地帮助了使这些系统成为可能。
3.库存预测
股市非常动荡。但是,这并不意味着无法预测。借助Pandas和其他一些库(例如NumPy和matplotlib),我们可以轻松地建立模型来预测股市的走势。这是可能的,因为以前有很多股票数据可以告诉我们它们的表现。通过学习这些库存数据,模型可以轻松地以某种准确性预测要采取的下一步行动。不仅如此,人们还可以借助这种预测模型自动进行股票买卖。
4.神经科学
了解神经系统一直是人类的思想,因为关于人体的许多潜在谜团尚未解决。 机器学习在熊猫的各种应用程序的帮助下极大地帮助了这一领域。同样,熊猫的数据处理能力在汇编大量数据中起了重要作用,这些数据已帮助神经科学家理解我们体内遵循的趋势以及各种事物对整个神经系统的影响。
5.统计
纯粹的数学本身在熊猫的各种应用中取得了很大的进步。由于Statistic处理大量数据,因此像Pandas这样处理数据处理的库以许多不同的方式提供了帮助。平均值,中位数和众数功能只是非常基本的功能,有助于执行统计计算。统计数据还有许多其他复杂的功能,熊猫在其中发挥着巨大的作用,以带来完美的结果。
6.广告
广告在21世纪取得了巨大的飞跃。如今,广告已变得非常个性化,可以帮助公司赢得越来越多的客户。仅由于机器学习和深度学习之类的原因,这再次成为可能。遍历客户数据的模型将学习了解客户到底想要什么,从而为公司提供出色的广告创意。熊猫在这方面有许多应用。通常在此库的帮助下呈现客户数据,Pandas中提供的许多功能也有帮助。
7.分析
通过使用熊猫,分析变得比以往任何时候都容易。无论是网站分析还是其他平台的分析,Pandas都以其惊人的数据处理和处理功能来完成所有工作。熊猫的可视化功能在该领域也发挥着重要作用。它不仅接收数据并显示它,而且还有助于在数据上应用许多功能。
8.自然语言处理
NLP或自然语言处理已席卷全球,并引起了很多轰动。主要概念是解释人类语言及其相关的一些细微差别。这非常困难,但是借助Pandas和Scikit-learn的各种应用程序,可以更轻松地创建一个NLP模型,借助其他各种库及其功能,我们可以不断对其进行改进。
9.大数据
熊猫的应用之一就是它也可以处理大数据。Python与Hadoop和Spark有着良好的联系,从而使Pandas可以访问大数据。 借助Pandas,也可以轻松地编写Spark或Hadoop。
10.数据科学
熊猫和数据科学几乎是同义词。大多数示例都是Data Science本身的产品。这是一个非常广泛的保护伞,涵盖了涉及数据分析的所有内容,因此,熊猫的几乎所有应用都属于数据科学的 范围。熊猫主要用于处理数据。因此,没有熊猫的Python数据科学非常困难。
摘要
通过上面给出的示例,我们遇到了熊猫各种实时应用程序的完整列表。这些应用程序存在于我们的日常生活中,在现实世界中非常有用。现在,通过了解他们,我希望您能够轻松地确定在何处以及如何准确地运用自己的知识。您可能还想知道15种熊猫的高级功能。
更多文章和资料|点击下方文字直达 ↓↓↓
阿里云K8s实战手册
[阿里云CDN排坑指南]CDN
ECS运维指南
DevOps实践手册
Hadoop大数据实战手册
Knative云原生应用开发指南
OSS 运维实战手册
Pandas融化了多个价值变量
我有一个像这样的宽格式的数据集
Index Country Variable 2000 2001 2002 2003 2004 2005
0 Argentina var1 12 15 18 17 23 29
1 Argentina var2 1 3 2 5 7 5
2 Brazil var1 20 23 25 29 31 32
3 Brazil var2 0 1 2 2 3 3
我想重整我的数据以使年份,var1和var2成为新列
Index Country year var1 var2
0 Argentina 2000 12 1
1 Argentina 2001 15 3
2 Argentina 2002 18 2
....
6 Brazil 2000 20 0
7 Brazil 2001 23 1
当我只编写一个变量时,我的代码可以工作
df=(pd.melt(df,id_vars='Country',value_name='Var1',var_name='year'))
我无法弄清楚如何对var1,var2,var3等执行此操作。
关于与Python Pandas融化相反和python与pandas关系的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py:816: pandas 处理 NaN、PANDAS中类似SQL的窗口函数:Python Pandas Dataframe中的行编号、Pandas的10大惊人应用-哪个行业领域正在使用Python Pandas?、Pandas融化了多个价值变量等相关内容,可以在本站寻找。
本文标签: