在 pandas 列名称中查找模式并使用管道更改此类列

Find pattern in pandas column names and change such columns using pipe

假设我有以下计算,

import pandas as pd
dat = pd.DataFrame({'xx1' : [1,2,3], 'aa2' : ['qq', '4', 'd'], 'xx3' : [4,5,6]})
dat2 = (dat
        .assign(xx1 = lambda x : [str(i) for i in x['xx1'].values])
        .assign(xx3 = lambda x : [str(i) for i in x['xx3'].values])
    )

基本上,我需要找到那些列名称与模式 xx + sequence of numbers 匹配的列(即 xx1, xx2, xx3 等),然后对这些列应用一些转换(例如应用 str 函数)

我可以做到这一点的一种方法就像上面那样,即手动找到那些列并执行转换。我想知道是否有任何方法可以推广这种方法。我更喜欢像上面那样使用 pipe

任何指针都会很有帮助。

你可以这样做:

# Matches all columns starting with 'xx' with a sequence of numbers afterwards. 
cols_to_transform = dat.columns[dat.columns.str.match('^xx[0-9]+$')]

# Transform to apply (column-wise).
transform_function = lambda c: c.astype(str)

# If you want a new DataFrame and not modify the other in-place.
dat2 = dat.copy()

dat2[cols_to_transform] = dat2[cols_to_transform].transform(transform_function, axis=0)

要在 assign 内使用:

# Here I put a lambda to avoid precomputing all the transformations in the dict comprehension.
dat.assign(**{col: lambda df: df[col].astype(str) for col in cols_to_transform})
import pandas as pd
frame = pd.DataFrame({'xx1' : [1,2,3], 'aa2' : ['qq', '4', 'd'], 'xx3' : [4,5,6]})

def parse_column(col, vals):
    if "xx" == col[:2] and col[2:].isdigit():
        return [str(i) for i in vals]
    return vals

for (name, col) in frame.iteritems():
    frame[name] = parse_column(name, col.values)
  1. 您可以遍历列,将它们的名称和值作为一个系列
  2. 令人难以置信的小众 str.isdigits() 功能作为 python 的固有部分存在,但它在这里很有用

一个选项是 select 相关列,应用您的函数并通过解包将它们分配回数据框:

result = dat.assign(**dat.filter(regex=r"xx\d+").astype(str))

result.dtypes

xx1    object
aa2    object
xx3    object
dtype: object

dat.dtypes

xx1     int64
aa2    object
xx3     int64
dtype: object