我有一个Pandas DataFrame:
>>> df
a b c
foo john george micheal
bar sean david sam
现在,我希望通过处理上述内容,使所有列的前两个字符都只有一个DataFrame。
因此,在声明之后,df
应该变成:
>>> df
a b c
foo jo ge mi
bar se da sa
我尝试了诸如:df['a'].str[:2]
之类的选项,此方法有效,但仅当我尝试df[df.columns].str[:2]
或df[:].str[:2]
之类的多列时,它才满足一列要求。
那我该如何实现呢?
答案 0 :(得分:2)
您可以使用apply
print(df.apply(lambda x: x.str[:2]))
1 2 3
0 jo ge mi
1 se da sa
答案 1 :(得分:0)
我正在寻找一些快速的矢量化解决方案。我有一个解决方案,它似乎比其他解决方案要快,它可以创建一个新的DataData,该值由Old DataFrame的值构成,我已经使用numpy's dtype operations完成了索引,并使用了较旧DataFrame的列名:
>>> pd.DataFrame(df.values.astype('<U2'),columns=df.columns)
因为我有大量列的DataFrame,所以当我对具有相同列数的虚拟timeit
进行df
时:
@ScootCork的答案:
>>> %t -n10 df.apply(lambda x: x.str[:2])
3.23 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
@anky的评论:
>>> %t -n10 df.applymap(lambda x: x[:2])
2.1 ms ± 404 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
@Shubham Sharma的评论:
>>> %t -n10 df.transform(lambda s: s.str[:2])
2.56 ms ± 393 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
我的解决方案:
>>> %t -n10 pd.DataFrame(df.values.astype('<U2'),columns=df.columns)
600 µs ± 95.1 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)