我需要在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,但它的确有效。
答案 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非常相关。我使用了该代码并将其应用于您的问题。我还在列名称中添加了一个浮点数,以确保它与int
和float
一起使用。它看起来像:
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()]