在Python中,使用特定的列名过滤pandas数据框。

27

我有一个pandas数据框和以下列表:

mylist = ['nnn', 'mmm', 'yyy']
mydata =
   xxx   yyy zzz nnn ddd mmm
0  0  10      5    5   5  5
1  1   9      2    3   4  4
2  2   8      8    7   9  0

现在,我想只获取mylist中提到的列,并将其保存为csv文件。

即:

     yyy  nnn   mmm
0    10     5     5
1    9      3     4
2    8      7     0

我当前的代码如下。

mydata = pd.read_csv( input_file, header=0)

for item in mylist:
    mydata_new = mydata[item]

print(mydata_new)
mydata_new.to_csv(file_name)

我觉得我的新数据框产生了错误的结果。我做错了什么?请帮帮我!

3个回答

65

只需将列名称的列表传递给索引 df

df[['nnn', 'mmm', 'yyy']]

   nnn  mmm  yyy
0    5    5   10
1    3    4    9
2    7    0    8
如果您需要处理列表中不存在的列名,请尝试使用df.columns.isin进行过滤 -
df.loc[:, df.columns.isin(['nnn', 'mmm', 'yyy', 'zzzzzz'])]

   yyy  nnn  mmm
0   10    5    5
1    9    3    4
2    8    7    0

你好,非常感谢。不过这是个打字错误,我已经更正了。顺便问一下,我想循环遍历而不是直接提到列标题,因为我的真实数据列表非常长。有没有什么特殊的方法可以做到这一点? - J Cena
@JCena 这可能会让你惊讶,但一次性选择它们会更快。 - cs95
感谢提供信息。我之所以这么说是因为mylist里有些列名实际上不在我的数据框中。所以我会得到这样的错误:KeyError:“['recipe' 'food' 'calories' ..., ] not in index"。有没有办法避免这种情况? - J Cena
@JCena 确实有。请看我的最后一次编辑。祝编码愉快! - cs95
如果您需要处理不存在的列名,则df.filter函数提供了比此处提出的.loc[:, df.columns.isin()]语法更清晰和更短的语法。有关更多详细信息,请参见下面的我的答案。 - Zoltán

5
你可以将mylist放入[]中,pandas会为你选择它。
mydata_new = mydata[mylist]

不确定你的yyy是否是拼写错误。

你犯错的原因在于每次循环都将mydata_new分配给一个新系列。

for item in mylist:
    mydata_new = mydata[item]  # <-  

因此,它将创建一个系列而不是您想要的整个数据框。


如果列表中的某些名称不在您的数据框中,您总可以使用以下方法进行检查:

len(set(mylist) - set(mydata.columns)) > 0

并将其打印出来
print(set(mylist) - set(mydata.columns))

然后检查是否存在拼写错误或其他意外行为。


你忽略了列名可能存在的“笔误”这个事实。 - cs95

1
如果mylist包含一些不在mydata.columns中的列名,你会得到一个错误,例如:
KeyError: "['fff'] not in index"

在这种情况下,您可以使用 df.filter 函数:
mydata.filter(['nnn', 'mmm', 'yyy', 'fff'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接