【问题标题】:pandas : extracting column1's value at column2th position熊猫:在第 2 列的位置提取第 1 列的值
【发布时间】:2018-03-13 04:47:17
【问题描述】:

我有一个包含两列一字符串列和一整数列的数据框。

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().

【问题讨论】:

    标签: python string pandas dataframe


    【解决方案1】:

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

    在这种情况下,列表推导来拯救 -

    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 速度运行的列表推导是一种非常高效的替代方案。

    较慢的替代方案包括(为了完整起见),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
    

    【讨论】:

    • @deega 太好了,我很高兴听到这个消息。
    【解决方案2】:

    在这里发挥想象力进行矢量化...
    这比它的价值更麻烦。使用 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
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2016-12-28
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多