我有一个非常简单的问题,我无法解决。
我创建了一个数据框,我希望生成一个新列,其中一列的切片字符串与另一列的切片值。
例: 由此:
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值结束。
非常感谢任何帮助
答案 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)