在Pandas中查找数字列名称

时间:2017-05-10 16:46:50

标签: python pandas dataframe

我需要在Pandas中选择仅包含列名中数值的列,例如:

df=
          0     1     2     3     4 window_label next_states       ids
0      17.0  18.0  16.0  15.0  15.0        ddddd           d      13.0
1      18.0  16.0  15.0  15.0  16.0        ddddd           d      13.0
2      16.0  15.0  15.0  16.0  15.0        ddddd           d      13.0
3      15.0  15.0  16.0  15.0  17.0        ddddd           d      13.0
4      15.0  16.0  15.0  17.0   NaN        ddddd           d      13.0

所以我只需要选择前五列。类似的东西:

df[df.columns.isnumeric()]

修改

我提出了解决方案:

digit_column_names = [num for num in list(df.columns) if isinstance(num, (int,float))]
df_new = df[digit_column_names]

不是非常pythonic或pandasian,但它的确有效。

5 个答案:

答案 0 :(得分:7)

尝试

df.ids = df.ids.astype('object')    
new_df = df.select_dtypes([np.number])


    0       1       2       3       4       
0   17.0    18.0    16.0    15.0    15.0    
1   18.0    16.0    15.0    15.0    16.0    
2   16.0    15.0    15.0    16.0    15.0    
3   15.0    15.0    16.0    15.0    17.0    
4   15.0    16.0    15.0    17.0    NaN     

编辑: 如果您有兴趣选择数字列名,可以执行以下操作。

df = pd.DataFrame({0: [1,2], '1': [3,4], 'blah': [5,6], 2: [7,8]})
df.columns = pd.to_numeric(df.columns, errors = 'coerce')
df[df.columns.dropna()]

你得到了

    0.0 1.0 2.0
0   1   3   7
1   2   4   8

答案 1 :(得分:1)

以下是编辑部分的答案:

我故意创建了一个列名称混合,作为可以转换为数字的实数和字符串:

In [44]: df.columns.tolist()
Out[44]: [0, 1, 2, 3, '4', 'window_label', 'next_states', 'ids']
# NOTE:                ^

我们可以使用pd.to_numeric(..., errors='coerce')方法:

In [41]: df.columns[pd.to_numeric(df.columns, errors='coerce').to_series().notnull()]
Out[41]: Index([0, 1, 2, 3, '4'], dtype='object')

In [42]: cols = df.columns[pd.to_numeric(df.columns, errors='coerce').to_series().notnull()]

In [43]: df[cols]
Out[43]:
      0     1     2     3     4
0  17.0  18.0  16.0  15.0  15.0
1  18.0  16.0  15.0  15.0  16.0
2  16.0  15.0  15.0  16.0  15.0
3  15.0  15.0  16.0  15.0  17.0
4  15.0  16.0  15.0  17.0   NaN

答案 2 :(得分:1)

我在这个网站上发现another question非常相关。我使用了该代码并将其应用于您的问题。我还在列名称中添加了一个浮点数,以确保它与intfloat一起使用。它看起来像:

import pandas as pd

df = pd.DataFrame({0: [17.0, 18, 16, 15, 15],
                   1: [18.0, 16, 15, 15, 16],
                   2.0: [16.0, 15, 15, 16, 15],
                   3: [15.0, 15, 16, 15, 17],
                   4: [15.0, 16, 15, 17, None],
                   'window_label': ['ddddd' for i in range(5)],
                   'next_states': ['d' for i in range(5)],
                   'ids': [13.0 for i in range(5)]})

num_cols = []
for col in df.columns.values:
    try:
        float(col)
        num_cols.append(col)
    except ValueError:
        pass

print(df[num_cols])

,结果如下:

      0     1   2.0     3     4
0  17.0  18.0  16.0  15.0  15.0
1  18.0  16.0  15.0  15.0  16.0
2  16.0  15.0  15.0  16.0  15.0
3  15.0  15.0  16.0  15.0  17.0
4  15.0  16.0  15.0  17.0   NaN

Edit1:我刚刚意识到你可以将数字限定器保留在生成器函数中,并且可以稍微更快/当然更少内存密集的方式来做同样的事情。

import pandas as pd


def is_num(cols):
    for col in cols:
        try:
            float(col)
            yield col
        except ValueError:
            continue

df = pd.DataFrame({0: [17.0, 18, 16, 15, 15],
                   1: [18.0, 16, 15, 15, 16],
                   2.0: [16.0, 15, 15, 16, 15],
                   3: [15.0, 15, 16, 15, 17],
                   4: [15.0, 16, 15, 17, None],
                   'window_label': ['ddddd' for i in range(5)],
                   'next_states': ['d' for i in range(5)],
                   'ids': [13.0 for i in range(5)]})

print(df[[col for col in is_num(df.columns.values)]])

产生与上面完全相同的结果,尽管它的可读性稍差。

答案 3 :(得分:1)

该解决方案如何?
这会检查列中的每个字符是否都是数字。

cols = [col for col in df.columns if all(char.isdigit() for char in col)]
df[cols]

答案 4 :(得分:0)

如果您只是在寻找数字列名称,我认为这应该有效:

df.columns[df.columns.str.isnumeric()]

或者

df.iloc[:,df.columns.str.isnumeric()]