用python中的特定列名过滤pandas数据框

J C*_*ena 5 python 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
Run Code Online (Sandbox Code Playgroud)

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

     yyy  nnn   mmm
0    10     5     5
1    9      3     4
2    8      7     0
Run Code Online (Sandbox Code Playgroud)

我当前的代码如下。

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)
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 14

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
Run Code Online (Sandbox Code Playgroud)

这应该是您要寻找的结果。随后to_csv调用结果将生成您的CSV文件。


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

df[['nnn', 'mmm', 'yyyy']]

   nnn  mmm  yyyy
0    5    5    10
1    3    4     9
2    7    0     8
Run Code Online (Sandbox Code Playgroud)

如果您需要处理列表中不存在的列名,请尝试使用df.columns.isin-

df.loc[:, df.columns.isin(['nnn', 'mmm', 'yyyy', 'zzzzzz'])]

   yyyy  nnn  mmm
0    10    5    5
1     9    3    4
2     8    7    0
Run Code Online (Sandbox Code Playgroud)


Tai*_*Tai 5

你可以直接放进mylist[],pandas 就会为你选择它。

mydata_new = mydata[mylist]
Run Code Online (Sandbox Code Playgroud)

不确定你的是否yyy有错字。

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

for item in mylist:
    mydata_new = mydata[item]  # <-  
Run Code Online (Sandbox Code Playgroud)

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


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

len(set(mylist) - set(mydata.columns)) > 0
Run Code Online (Sandbox Code Playgroud)

并打印出来

print(set(mylist) - set(mydata.columns))
Run Code Online (Sandbox Code Playgroud)

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