在python中使用特定的列名过滤pandas数据帧

时间:2018-01-11 00:05:00

标签: python pandas dataframe

我有一个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)

在我看来,我的新数据框产生了错误的结果。我在哪里弄错了?请帮帮我!

2 个答案:

答案 0 :(得分:7)

您的chapterbib之一缺少额外的yyy; - )

使用y并使用df.columns.str.contains进行过滤。

loc

这应该是您正在寻找的结果。对结果的后续df.loc[:, df.columns.str.contains('|'.join(mylist))] yyyy nnn mmm 0 10 5 5 1 9 3 4 2 8 7 0 调用将生成您的CSV文件。

如果您的to_csv元素是拼写错误,而您实际上是yyy,那么只需将列表作为索引器传递就可以了 -

yyyy

如果您需要在列表中处理不存在的列名称,请尝试使用df[['nnn', 'mmm', 'yyyy']] nnn mmm yyyy 0 5 5 10 1 3 4 9 2 7 0 8 进行过滤 -

df.columns.isin

答案 1 :(得分:2)

您可以将mylist放在[]内,而pandas会为您选择它。

mydata_new = mydata[mylist]

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

你错了的原因是你每次都在循环中为新系列分配mydata_new

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

因此,它会创建一个系列,而不是你想要的整个df。

如果列表中的某些名称不在您的数据框中,您可以随时查看,

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

并打印出来

print(set(mylist) - set(mydata.columns))

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