如何将另一个系列传递给pandas.Series.str.startswith

时间:2016-01-20 17:58:49

标签: python pandas

我有一个包含两列的DataFrame:uid和name:

In[1]: import pandas as pd

In[2]: df = pd.DataFrame([['123', 'OneTwoThree'],
                          ['456', '456 FourFiveSix'],
                          ['789', 'SevenEightNine']],
                         columns = ['uid', 'name'])
In[3]: df
Out[3]:
   uid             name
0  123      OneTwoThree
1  456  456 FourFiveSix
2  789   SevenEightNine

我想选择名称以uid开头的行。我可以用列表理解来做到这一点:

In[4]: df[[name.startswith(uid) for uid, name in zip(df.uid, df.name)]]
Out[4]:
   uid             name
1  456  456 FourFiveSix

我想知道是否有更优雅的方法来使用pandas.Series.str.startswith,例如类似的东西:

df[df.name.str.startswith(df.uid)]

1 个答案:

答案 0 :(得分:1)

我不知道是否更优雅,但它可以替代:

sw = lambda x: x["uid"] in x["name"]
df[df.apply(sw, axis=1)]

或者在一行中:

df[df.apply(lambda x: x["uid"] in x["name"], axis=1)]

如果要求startswith

sw2 = lambda x: x["name"].startswith(x["uid"])
df[df.apply(sw2, axis=1)]

事实证明lambda版本比你的慢(至少在你的数据集上),所以如果速度很重要,这比你的快一点,但你的数据帧只需要包含2列:

df[[name.startswith(uid) for uid, name in df.values]]