在pandas中选择以starts开头的列

Ale*_*der 3 python pandas

您好,我有一个数据,我想重命名其中一列并选择以t字符串开头的列。

raw_data = {'patient': [1, 1, 1, 2, 2],
        'obs': [1, 2, 3, 1, 2],
        'treatment': [0, 1, 0, 1, 0],
        'score': ['strong', 'weak', 'normal', 'weak', 'strong'],    
        'tr': [1,2,3,4,5],
        'tk': [6,7,8,9,10],
        'ak': [11,12,13,14,15]

        }
df = pd.DataFrame(raw_data, columns = ['patient', 'obs', 'treatment', 'score','tr','tk','ak'])

df

   patient  obs  treatment   score  tr  tk  ak
0        1    1          0  strong   1   6  11
1        1    2          1    weak   2   7  12
2        1    3          0  normal   3   8  13
3        2    1          1    weak   4   9  14
4        2    2          0  strong   5  10  15
Run Code Online (Sandbox Code Playgroud)

所以我尝试遵循python-pandas-renaming-column-name-startswith

df.rename(columns = {'treatment':'treat'})[['score','obs',df[df.columns[pd.Series(df.columns).str.startswith('t')]]]]
Run Code Online (Sandbox Code Playgroud)

但出现这个错误

类型错误:“DataFrame”对象是可变的,因此无法对它们进行哈希处理

如何选择以 开头的列t

谢谢

jez*_*ael 6

Series不需要转换为,但如果想要添加到另一个列列表,请将输出转换为list

cols =  df.columns[df.columns.str.startswith('t')].tolist()

df = df[['score','obs'] + cols].rename(columns = {'treatment':'treat'})
Run Code Online (Sandbox Code Playgroud)

另一个想法是使用 2 个掩码并按位|链接OR

注意

列名称是从解决方案中之前的原始列名称中过滤出来的rename,因此以后有必要重命名。

m1 = df.columns.str.startswith('t')
m2 = df.columns.isin(['score','obs'])

df = df.loc[:, m1 | m2].rename(columns = {'treatment':'treat'})
print (df)
   obs  treat   score  tr  tk
0    1      0  strong   1   6
1    2      1    weak   2   7
2    3      0  normal   3   8
3    1      1    weak   4   9
4    2      0  strong   5  10
Run Code Online (Sandbox Code Playgroud)

如果rename首先需要,有必要通过重命名的列名称重新分配回过滤器:

df = df.rename(columns = {'treatment':'treat'})
df = df.loc[:, df.columns.str.startswith('t') | df.columns.isin(['score','obs'])] 
Run Code Online (Sandbox Code Playgroud)