gpt4 book ai didi

python - Pandas 数据框 : return column that is a compression of other columns

转载 作者:行者123 更新时间:2023-11-30 23:23:58 25 4
gpt4 key购买 nike

我有一个包含很多列的数据框,其中任意数量的列名称适合特定的字符串模式。如果任何其他列中有“r”,我想创建一个设置为“r”的新列。我可以做这样的事情:

for col in df.columns:
if 'abc' in col:
for i in df.index:
if df.ix[i, col] == 'r':
df.ix[i, 'newcol'] = 'r'

然而,这有点丑陋且缓慢。有没有更快的方法来做到这一点?

编辑:包括我的源数据的示例:

df = pd.DataFrame({'abc1':['r','r','n','n'], 'abc2':['r','n','n','r'], 'xyz1':['r','n','n','n'], 'xyz2':['n','n','r','n']})

我需要的输出(在“newcol”中)是:

  abc1 abc2 xyz1 xyz2 newcol
0 r r r n r
1 r n n n r
2 n n n r nan
3 n r n n r

(nan 可以被几乎任何东西代替,只要它不是“r”)。或者 newcol 可以包含 True, True, False, True 这也可以很好地满足我的目的。

最佳答案

嗯,我可能会这样做(一个示例数据框,希望能够很好地捕获您的情况):

>>> df

A B abc1 abc2 abc3 abc4
0 1 4 x r a d
1 1 3 y d b e
2 2 4 z e c r
3 3 5 r g d f
4 4 8 z z z z

获取感兴趣的列:

>>> cols = [x for x in df.columns if 'abc' in x]
>>> cols
['abc1', 'abc2', 'abc3', 'abc4']

>>> df['newcol'] = (df[cols] == 'r').any(axis=1).map({True:'r',False:'np.nan'})
>>> df

A B abc1 abc2 abc3 abc4 newcol
0 1 4 x r a d r
1 1 3 y d b e np.nan
2 2 4 z e c r r
3 3 5 r g d f r
4 4 8 z z z z np.nan

这应该相当快;我认为即使在这里使用 map 也将是 Cythonized 调用。如果 boleen 向量对于 newcol 来说足够了,您可以将其简化为以下内容:

>>> df['newcol'] = (df[cols] == 'r').any(axis=1)
>>> df

A B abc1 abc2 abc3 abc4 newcol
0 1 4 x r a d True
1 1 3 y d b e False
2 2 4 z e c r True
3 3 5 r g d f True
4 4 8 z z z z False

现在,如果您需要检查字符串是否包含“r”而不是等于“r”,您可以执行以下操作:

>>> df

A B abc1 abc2 abc3 abc4
0 1 4 x root a d
1 1 3 y d b e
2 2 4 z e c bar
3 3 5 r g d f
4 4 8 z z z z

>>> cols = [x for x in df.columns if 'abc' in x]
>>> df['newcol'] = df[cols].apply(lambda x: x.str.contains('r'),axis=0).any(axis=1)
>>> df['newcol'] = df['newcol'].map({True:'r',False:'np.nan'})
>>> df

A B abc1 abc2 abc3 abc4 newcol
0 1 4 x root a d r
1 1 3 y d b e np.nan
2 2 4 z e c bar r
3 3 5 r g d f r
4 4 8 z z z z np.nan

这应该仍然相当快,因为​​它对每一列使用pandas'矢量化字符串方法(应用是跨列的,而不是对行的迭代)。

关于python - Pandas 数据框 : return column that is a compression of other columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23718340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com