【问题标题】:pandas dataframe substring df['column1'].str[:'column2']pandas 数据帧子字符串 df['column1'].str[:'column2']
【发布时间】:2015-01-25 20:58:29
【问题描述】:

我有一个带有列的数据框 (df) (A=object, B=int64) 我需要的是能够根据'B'的值获得'A'的子字符串。

我想得到这样的“C”:

  A      B    C
=====  =====  =========================
Jimmy  4      Jimm
Tommy  2      To
Karl   3      Kar
Jane   1      J
=====  =====  =========================

到目前为止,我尝试过这个:

df['C'] = df['A'].str[:df['B']]

我也试过这个:

l = (lambda x,y: str(x)[:y])

df[['A','B']].apply(l)

运气不好。

【问题讨论】:

    标签: python pandas lambda substring


    【解决方案1】:

    以下工作,但它不会很快,因为它在每一行上作为循环运行,这里的关键是传递参数 axis=1 以逐行操作,然后我们可以访问每一列的值:

    In [46]:
    
    df['C'] = df.apply(lambda x: x['A'][:x['B']], axis=1)
    df
    Out[46]:
           A  B     C
    0  Jimmy  4  Jimm
    1  Tommy  2    To
    2   Karl  3   Kar
    3   Jane  1     J
    

    所以只是看看你的尝试以及为什么它们不起作用:df['C'] = df['A'].str[:df['B']] 这将失败,因为你试图通过传递一个系列来为列 A 中的每个元素下标,不幸的是,它必须是一些恒定的 int 值,这是个好主意,但行不通。

    l = (lambda x,y: str(x)[:y])
    df[['A','B']].apply(l)
    

    这不起作用,因为df[['A', 'B']] 的结果只是您的原始df,您没有指定要操作的axis,因此默认为0,这是按列排列的,实际上是您的lambda现在失败了,因为只传递了一个参数,在第一次迭代中将是df['A'],因此完成这项工作的唯一方法是通过传递参数axis=1 逐行操作。目前我想不出更好的方法。

    【讨论】:

    • EdChum,txs v-much。有用。 axis=1 技巧使它起作用。 txs 也用于解释。
    • @dvinciworks 不用担心,如果它为您回答了所有问题,您可以接受我的回答,我的回答左上角会有一个空的勾号
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2019-03-14
    • 2018-02-20
    相关资源
    最近更新 更多