该(x, y)API已经日益普及,多年来,然而,没有关于它的一切是完全理解在结构方面,工作和相关的操作.
一个重要的操作是过滤.过滤是一种常见的要求,但用例是多种多样的.因此,某些方法和功能将比其他用例更适用于某些用例.
总之,本文的目的是触及一些常见的过滤问题和用例,演示解决这些问题的各种不同方法,并讨论它们的适用性.本文试图解决的一些高级问题是
这些问题已分解为6个具体问题,如下所列.为简单起见,以下设置中的示例DataFrame仅具有两个级别,并且没有重复的索引键.提出问题的大多数解决方案可以推广到N级.
本文不会介绍如何创建MultiIndexes,如何对它们执行赋值操作,或任何与性能相关的讨论(这些是另一个时间的单独主题).
问题1-6将在上下文中询问下面的设置.
Run Code Online (Sandbox Code Playgroud)mux = pd.MultiIndex.from_arrays([ list('aaaabbbbbccddddd'), list('tuvwtuvwtuvwtuvw') ], names=['one', 'two']) df = pd.DataFrame({'col': np.arange(len(mux))}, mux) col one two a t 0 u 1 v 2 w 3 b t 4 u 5 v 6 w 7 t 8 c u 9 v 10 d w 11 t 12 u 13 v 14 w 15
问题1:选择单个项目
如何在"1"级中选择"a"的行?
col
one two
a t 0 …Run Code Online (Sandbox Code Playgroud) 我想在一个pandas数据帧的所述列中的每个值的开头附加一个字符串(优雅地).我已经想出了如何做到这一点,我目前正在使用:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Run Code Online (Sandbox Code Playgroud)
这似乎是一件不公平的事情 - 你知道其他任何方式(也许这个特性也可以将字符添加到该列为0或NaN的行中)吗?
如果还不清楚,我想转向:
col
1 a
2 0
Run Code Online (Sandbox Code Playgroud)
成:
col
1 stra
2 str0
Run Code Online (Sandbox Code Playgroud) 我有一个带有以下列名的pandas数据帧:
Result1,Test1,Result2,Test2,Result3,Test3等......
我想删除名称中包含单词"Test"的所有列.这些列的数量不是静态的,而是取决于先前的函数.
我怎样才能做到这一点?
我不知道为什么这会让NaN进入"新"栏目?
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
Run Code Online (Sandbox Code Playgroud) 我想要元素方面的逻辑OR运算符.我知道"或"本身并不是我想要的.
我知道AND对应于&和不对~.但是OR怎么样?
python boolean-logic logical-operators boolean-operations pandas
我有一个熊猫系列sf:
email
email1@email.com [1.0, 0.0, 0.0]
email2@email.com [2.0, 0.0, 0.0]
email3@email.com [1.0, 0.0, 0.0]
email4@email.com [4.0, 0.0, 0.0]
email5@email.com [1.0, 0.0, 3.0]
email6@email.com [1.0, 5.0, 0.0]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为以下DataFrame:
index | email | list
_____________________________________________
0 | email1@email.com | [1.0, 0.0, 0.0]
1 | email2@email.com | [2.0, 0.0, 0.0]
2 | email3@email.com | [1.0, 0.0, 0.0]
3 | email4@email.com | [4.0, 0.0, 0.0]
4 | email5@email.com | [1.0, 0.0, 3.0]
5 | email6@email.com | [1.0, 5.0, 0.0]
Run Code Online (Sandbox Code Playgroud)
我找到了一种方法,但我怀疑它是更有效的方法:
df1 = pd.DataFrame(data=sf.index, columns=['email']) …Run Code Online (Sandbox Code Playgroud) 当我将csv文件读取到pandas数据帧时,每个列都会转换为自己的数据类型.我有一个转换为对象的列.我想为此列执行字符串操作,例如拆分值和创建列表.但是没有这样的操作是可能的,因为它的dtype是对象.任何人都可以让我知道将列的所有项目转换为字符串而不是对象的方法吗?
我尝试了几种方法但没有任何效果.我使用了astype,str(),to_string等.
a=lambda x: str(x).split(',')
df['column'].apply(a)
Run Code Online (Sandbox Code Playgroud)
df['column'].astype(str)
Run Code Online (Sandbox Code Playgroud) 是否有任何方法可以None在Python 中用Pandas 替换值?
您可以使用df.replace('pre', 'post')并可以将值替换为另一个值,但如果您想要替换None值,则无法执行此操作,如果您尝试,则会得到一个奇怪的结果.
所以这是一个例子:
df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)
Run Code Online (Sandbox Code Playgroud)
返回成功的结果.
但,
df.replace('-', None)
Run Code Online (Sandbox Code Playgroud)
返回以下结果:
0
0 - // this isn't replaced
1 3
2 2
3 5
4 1
5 -5
6 -1
7 -1 // this is changed to `-1`...
8 9
Run Code Online (Sandbox Code Playgroud)
为什么会返回这么奇怪的结果?
由于我想将这个数据帧倒入MySQL数据库,因此我无法将NaN值放入数据框中的任何元素中,而是想放入None.当然,您可以先更改'-'为NaN然后转换NaN为None,但我想知道为什么数据框以这种可怕的方式运行.
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?假设我给三个文件路径指向要读取的Spark上下文,并且每个文件在第一行中都有一个模式.我们如何从头文件中跳过架构线?
val rdd=sc.textFile("file1,file2,file3")
Run Code Online (Sandbox Code Playgroud)
现在,我们如何跳过此rdd的标题行?
pandas ×9
python ×9
dataframe ×5
apache-spark ×1
apply ×1
csv ×1
multi-index ×1
nan ×1
performance ×1
replace ×1
scala ×1
series ×1
slice ×1
string ×1