【问题标题】:Assign slice of variable lenght to column with method chaining使用方法链接将可变长度切片分配给列
【发布时间】:2020-04-09 00:05:59
【问题描述】:

我想为一列分配另一列的变量 lentgh 切片,但不知何故,它没有按我的预期工作,我不明白为什么:

import numpy as np
import pandas as pd

m = np.array([[1, 'AAAAA'],
               [2, 'BBBB'],
               [3, 'CCC']])

df = (pd.DataFrame(m, columns = ['id', 's1'])
        .assign(
                s2 = lambda x: x['s1'].str.slice(start=0, stop=x['s1'].str.len()-1))
        )

print(df)

导致

  id     s1  s2
0  1  AAAAA NaN
1  2   BBBB NaN
2  3    CCC NaN

但是,我希望如下:

  id     s1   s2
0  1  AAAAA AAAA
1  2   BBBB  BBB
2  3    CCC   CC

知道这里发生了什么吗?

【问题讨论】:

    标签: pandas assign


    【解决方案1】:

    您需要str[:-1] 来索引没有最后一个列的所有值:

    df = (pd.DataFrame(m, columns = ['id', 's1'])
            .assign(
                    s2 = lambda x: x['s1'].str[:-1])
            )
    
    print(df)
      id     s1    s2
    0  1  AAAAA  AAAA
    1  2   BBBB   BBB
    2  3    CCC    CC
    

    您的解决方案只能使用apply 分别检查每一行,例如:

    df = (pd.DataFrame(m, columns = ['id', 's1'])
            .assign(
                    s2 = lambda x: x.apply(lambda y: y['s1'][0:len(y['s1'])-1], axis=1))
            )
    
    print(df)
      id     s1    s2
    0  1  AAAAA  AAAA
    1  2   BBBB   BBB
    2  3    CCC    CC
    

    【讨论】:

    • 非常感谢 - 这显然是正确的做法。但是,为什么我的方法不起作用?我应该能够数出字符数然后减1,不是吗?
    • @divingTobi - 我认为问题在于您的解决方案是每个值的传递长度不同,因此可能的解决方案是使用apply。但如果只想删除最后一个传递 -1 的值会更好。
    【解决方案2】:

    问题出在您的slice() stop arg 中,只需-1

    df = (pd.DataFrame(m, columns = ['id', 's1'])
            .assign(
                    s2 = lambda x: x['s1'].str.slice(start=0, stop=-1)
            )
    

    【讨论】:

      【解决方案3】:

      你可以像这样对 pandas 使用 apply:

      在[1]中:import pandas as pd
      
      在 [2] 中:df = pd.DataFrame({"id":[1,2,3],"s1":["AAAAA","BBBB","CCC"]})
      
      在 [3] 中:df
      输出[3]:
         编号 s1
      0 1 AAAAA
      1 2 BBBB
      2 3 CCC
      
      在 [4]: df["s2"] = df["s1"].apply(lambda x: x[:-1])
      
      在 [5] 中:df
      输出[5]:
         编号 s1 s2
      0 1 啊啊啊啊啊
      1 2 BBBB BBB
      2 3 CCC CC
      
      在[6]中:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-28
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 2016-04-18
        • 2011-04-21
        • 2013-05-22
        相关资源
        最近更新 更多