Pandas 使用方法链接将变量长度的切片指定给列

Pandas 使用方法链接将变量长度的切片指定给列,pandas,assign,Pandas,Assign,我想为一列分配另一列的变量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(

我想为一列分配另一列的变量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

知道这里发生了什么吗?

问题出在
切片()
stop
arg中,它只需要
-1

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

问题出在
slice()
停止
参数中,它只需要是
-1

df = (pd.DataFrame(m, columns = ['id', 's1'])
        .assign(
                s2 = lambda x: x['s1'].str.slice(start=0, stop=-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
您的解决方案仅适用于单独检查每一行,如:

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

您需要
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
您的解决方案仅适用于单独检查每一行,如:

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

您可以使用如下方式申请熊猫:

In [1]: import pandas as pd In [2]: df = pd.DataFrame({"id":[1,2,3],"s1":["AAAAA","BBBB","CCC"]}) In [3]: df Out[3]: id s1 0 1 AAAAA 1 2 BBBB 2 3 CCC In [4]: df["s2"] = df["s1"].apply(lambda x: x[:-1]) In [5]: df Out[5]: id s1 s2 0 1 AAAAA AAAA 1 2 BBBB BBB 2 3 CCC CC In [6]: 在[1]中:导入熊猫作为pd 在[2]中,df=pd.DataFrame({“id”:[1,2,3],“s1”:[“AAAAA”,“BBBB”,“CCC”]}) In[3]:df 出[3]: id s1 0 1 AAAA 1.2 BBBB 2.3 CCC 在[4]中:df[“s2”]=df[“s1”]。应用(lambda x:x[:-1]) In[5]:df 出[5]: id s1 s2 0 1 AAAAA AAAA AAAA 1.2 BBBB BBB 2 3 CCC CC
在[6]:中,您可以像这样使用apply for pandas:

In [1]: import pandas as pd In [2]: df = pd.DataFrame({"id":[1,2,3],"s1":["AAAAA","BBBB","CCC"]}) In [3]: df Out[3]: id s1 0 1 AAAAA 1 2 BBBB 2 3 CCC In [4]: df["s2"] = df["s1"].apply(lambda x: x[:-1]) In [5]: df Out[5]: id s1 s2 0 1 AAAAA AAAA 1 2 BBBB BBB 2 3 CCC CC In [6]: 在[1]中:导入熊猫作为pd 在[2]中,df=pd.DataFrame({“id”:[1,2,3],“s1”:[“AAAAA”,“BBBB”,“CCC”]}) In[3]:df 出[3]: id s1 0 1 AAAA 1.2 BBBB 2.3 CCC 在[4]中:df[“s2”]=df[“s1”]。应用(lambda x:x[:-1]) In[5]:df 出[5]: id s1 s2 0 1 AAAAA AAAA AAAA 1.2 BBBB BBB 2 3 CCC CC
在[6]:非常感谢-这显然是正确的做法。然而,为什么我的方法不起作用?我应该能够计算字符数,然后减去1,否?@divingTobi-我认为问题在于您的解决方案是为每个不同的值传递长度,所以可能的解决方案是使用
应用
。但是如果想只删除最后一个值,则传递
-1
更好。非常感谢-这显然是正确的方法。然而,为什么我的方法不起作用?我应该能够计算字符数,然后减去1,否?@divingTobi-我认为问题在于您的解决方案是为每个不同的值传递长度,所以可能的解决方案是使用
应用
。但如果要删除,则最好只删除通过
-1
的最后一个值。