获取一列对象的最后一个字符并将其作为数据帧上的列 - pandas python

时间:2017-06-30 15:02:05

标签: python pandas dataframe

我有一个如下数据框:

df =

A   B   D
a1  b1  9052091001A
a2  b2  95993854906
a3  b3  93492480190
a4  b4  93240941993

我想要的是什么:

df_resp =

A   B   D
a1  b1  001A
a2  b2  4906
a3  b3  0190
a4  b4  1993

我尝试了什么:

for i in (0,len(df['D'])):
    df['D'][i]= df['D'][i][-4:]

我得到的错误:

  

KeyError:4906

此外,它需要很长时间,我认为应该有更快的方式与熊猫。

2 个答案:

答案 0 :(得分:1)

使用apply()的{​​{1}}方法,它比使用pandas.Series循环迭代更快......

这应该有效(如果列只包含字符串):

for

对于df_resp = df.copy() df_resp['D'] = df_resp['D'].apply(lambda x : x[-4:]) ,它可能来自您的DataFrame索引,因为调用KeyError等同于df['D'][i],即df.loc[i]['D']指的是索引& #39;标签,而不是它的位置。如果您用i替换它,它可能(可能)有用,它引用位置df.loc[i]['D']的索引。

我希望这有帮助!

答案 1 :(得分:1)

使用pd.Series.str字符串访问器进行矢量化字符串操作。这些优于使用apply

如果D元素已经是字符串

df.assign(D=df.D.str[-4:])

    A   B     D
0  a1  b1  001A
1  a2  b2  4906
2  a3  b3  0190
3  a4  b4  1993

如果不是

df.assign(D=df.D.astype(str).str[-4:])

    A   B     D
0  a1  b1  001A
1  a2  b2  4906
2  a3  b3  0190
3  a4  b4  1993

您可以使用

进行更改
df['D'] = df.D.str[-4:]