Python:在数据框中,创建一个新列,其中的字符串从具有另一列值的列切片

时间:2016-02-10 04:53:35

标签: python pandas slice

我有一个非常简单的问题,我无法解决。

我创建了一个数据框,我希望生成一个新列,其中一列的切片字符串与另一列的切片值。

例: 由此:

dftest = pd.DataFrame({'string' : ['EXAMPLE']*5, 'position' : [1, 2, 3, 4, 5]})

   position   string
0         1  EXAMPLE
1         2  EXAMPLE
2         3  EXAMPLE
3         4  EXAMPLE
4         5  EXAMPLE
5         1  OTHER
6         2  OTHER
7         3  OTHER

我想要这个:

   position   string    new
0         1  EXAMPLE  E
1         2  EXAMPLE  EX
2         3  EXAMPLE  EXA
3         4  EXAMPLE  EXAM
4         5  EXAMPLE  EXAMP
5         1  OTHER    O
6         2  OTHER    OT
7         3  OTHER    OTH

我试过了:

dftest['new'] = dftest.string.str[:dftest.position]
dftest['new'] = dftest.string.str[:dftest['position']]
dftest['new'] = dftest.string[:dftest.position]

以及不同的行迭代方法,但每次我都以Nan值结束。

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作

dftest['new'] = [dftest.iloc[i]['string'][0:dftest.iloc[i]['position']] for i in range(0,len(dftest))]

这将检查位置。

答案 1 :(得分:1)

一种方法是使用列表推导来枚举字符串。

dftest['new'] = [s[:n] for s, n in zip(dftest.string, dftest.position)]

>>> dftest
   position   string    new
0         1  EXAMPLE      E
1         2  EXAMPLE     EX
2         3  EXAMPLE    EXA
3         4  EXAMPLE   EXAM
4         5  EXAMPLE  EXAMP
5         1    OTHER      O
6         2    OTHER     OT
7         3    OTHER    OTH

答案 2 :(得分:1)

您可以使用iterrows方法:

for i, row in df.iterrows():
    df.loc[i, 'new'] = row['string'][:row['position']]

示例:

In [60]: dftest
Out[60]:
   position   string
0         1  EXAMPLE
1         2  EXAMPLE
2         3  EXAMPLE
3         4  EXAMPLE
4         5  EXAMPLE
5         1    OTHER
6         2    OTHER
7         3    OTHER

for i, row in dftest.iterrows():
    dftest.loc[i, 'new'] = row['string'][:row['position']]


In [62]: dftest
Out[62]:
   position   string    new
0         1  EXAMPLE      E
1         2  EXAMPLE     EX
2         3  EXAMPLE    EXA
3         4  EXAMPLE   EXAM
4         5  EXAMPLE  EXAMP
5         1    OTHER      O
6         2    OTHER     OT
7         3    OTHER    OTH

修改

或者您可以使用更方便的apply

dftest.apply(lambda x: x['string'][:x['position']], axis=1)