Pandas 使用方法链接将变量长度的切片指定给列
我想为一列分配另一列的变量lentgh片段,但不知何故,它并不像我预期的那样工作,我不明白为什么: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(
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
的最后一个值。