Pandas:在第2列位置提取第1列的值

2024-09-30 18:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列的数据帧一个字符串列&;一个整数列

column1  column2
 abcdef        2
  gtihj        4
  jiuwq        3

我想要另一个column3,column1的值在col2位置,类似这样

column1    column2   column3    
abcdef     2         b
gtihj      4         h
jiuwq      3         u

我尝试了以下代码

result['column1'].str.get(result['column2'])

但是下面的错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Tags: 数据字符串代码get整数resultcol2amp
2条回答

生成错误的原因是str.get需要一个标量索引,而不是索引列表/iterable(它既不理解这种输入,也不知道如何处理它)

在这种情况下,一个列表理解来拯救-

df['column3'] = [i[j - 1] for i, j in zip(df.column1, df.column2)]

df    
  column1  column2 column3
0  abcdef        2       b
1   gtihj        4       h
2   jiuwq        3       u

这个问题基本上很难矢量化,因此以C-speed运行的列表理解是一个非常有效的选择

较慢的替代方案包括(为了完整性),apply

df['column3'] = df.apply(lambda x: x.column1[x.column2 - 1], 1)

df    
  column1  column2 column3
0  abcdef        2       b
1   gtihj        4       h
2   jiuwq        3       u

np.vectorize

f = np.vectorize(lambda x, y: x[y - 1])
df['column3'] = f(df.column1, df.column2)

df
  column1  column2 column3
0  abcdef        2       b
1   gtihj        4       h
2   jiuwq        3       u

在这里展开想象……
这太麻烦了。使用cᴏʟᴅsᴘᴇᴇᴅ'理解。
这篇文章如何增加价值,是因为它验证了以更好的方式做这件事是非常重要的

slc = np.append(
    0, df.column1.str.len().values[:-1].cumsum()
) + df.column2.values - 1

df.assign(column3=np.array(list(''.join(df.column1)))[slc])

  column1  column2 column3
0  abcdef        2       b
1   gtihj        4       h
2   jiuwq        3       u

相关问题 更多 >