从整个列的DF获取索引值的索引值的DataFrame

时间:2020-06-28 15:50:45

标签: python pandas dataframe

我有一个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]之类的多列时,它才满足一列要求。 那我该如何实现呢?

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)