在 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)
- 您可以遍历列,将它们的名称和值作为一个系列
- 令人难以置信的小众
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
假设我有以下计算,
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)
- 您可以遍历列,将它们的名称和值作为一个系列
- 令人难以置信的小众
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