2016-12-19 168 views
1

我意识到您可以使用iloc(例如inf1.iloc[:,3])返回第三列来按列编号选择数据。但是,当我尝试使用它来使用列来过滤行时,它不起作用。例如,如果列标题为摘要inf2 = inf1[inf1.Summary == 'GREEN']创建一个数据集,其中包含摘要列中的绿色的所有行, 但inf2 = inf1[inf1.iloc[:,3] == 'GREEN']不包含。任何帮助深表感谢。我怀疑我错过了一些明显的东西。熊猫根据数字选择列进行分析

为了更清楚,我导入一个大的csv文件。

Station ID, Unnamed:1, Summary, Fault, Unnamed: 4 etc etc 
558656,  New Lane, GREEN, NO, 11000 
558656,  New Lane, AMBER, NO, 11000 
558656,  New Lane, RED,  NO, 11000 
558656,  New Lane, GREEN, NO, 11000 

,并希望与绿色在摘要栏内只返回行,运行一些进一步的分析之前。

  • 尝试:inf2 = inf1[inf1.Summary == 'GREEN']创造我想要的东西,但 依赖于列名,可尽管数据列停留在相同的顺序此 文件的版本之间切换。

  • 尝试:inf2 = inf1[inf1.iloc[:,3] == 'GREEN']没有工作,

  • 解决方法:建议inf2 = inf1[inf1[inf1.columns[2]] == 'GREEN'] 做了,这解决了我的问题,这要归功于在评论@quapka。

+1

什么'INF 2 = INF1 [INF1 [inf1.columns [2] == '绿色']'? – quapka

+0

@quapka确实有效!谢谢。我显然需要额外的inf1,但我不明白为什么!非常感谢。 –

+0

'inf1.columns [2]'获得'inf1'中第三列的名称。 'inf1 [inf1.columns [2]]'使用第三列的名称从'inf1'获取它,然后可以将它与'=='GREEN''进行比较,这会创建'True/False'的掩码(这可能不准确),然后用它从'inf1'获取正确的行。 – quapka

回答

0

你的方法应该工作;一定还有其他事情要做。下面是按预期工作重复的例子:

import numpy as np 
import pandas as pd 

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) 

df[df.iloc[:,3]>40] 
+0

我已经意识到了这个问题,在我的答案的第一行“inf1.iloc [:,3]返回第三列”。它返回第4列。花了这么长时间试图获得数据,我错过了一个简单的列错误编号。感谢您的帮助!顺便说一句,当试图运行您的示例代码df = pd.DataFrame行给我“ValueError:传递值的形状是(5,100),索引暗示(4,100)” –

+0

啊是的,我有很多这些错误我首先从R移动到零索引。很高兴你知道,并感谢在我的例子中指出错字。它被纠正了。 –