我有一个包含两列的 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)]
我不知道是否更优雅,但它是另一种选择:
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]]
我是一名优秀的程序员,十分优秀!