【问题标题】:Extract values from a column in a Dataframe based in starting letters根据起始字母从数据框中的列中提取值
【发布时间】:2021-04-01 10:30:44
【问题描述】:

希望每个人都做得很好。我正在使用 pandas 和 numpy,我想根据 Dataframe 中的前 3 个字母(ap.)提取列值。下面是我的数据框示例。

Name Number
Orange 2
APple 6
Ap.ricot 1
AP.19 1
Juap.rte 3

我已经尝试过 df[df['Name'].str.lower().str.contains('ap.', na=False)].Name.unique() 但它并没有完全做到这一点.

输出:

['AP.19','Ap.ricot']

理想情况下,输出应该是一个列表,然后我可以将其保存到变量中。此外,这 3 个字母需要在开头并按此顺序。

我对 Python 很陌生,所以请尽可能清楚地解释。谢谢。

【问题讨论】:

  • 您想取出您的代码仅找到“Ap”的值吗?
  • 不,我想以列表形式提取以“ap”开头的值。当然,还需要将所有内容都转换为小写,但输出必须是原始形式。所以正是我的输出,否则“Ap”也将包括“苹果”。
  • 请检查我的答案一次。
  • 您也可以尝试使用Match

标签: python pandas string list dataframe


【解决方案1】:

鉴于帖子中的cmets,我相信您可以完成:

ap = [x for x in df['Name'] if x.lower().startswith('ap.')]

如果你不想重复,那么你可以使用:

ap = [x for x in df['Name'].unique() if x.lower().startswith('ap.')]

【讨论】:

  • 谢谢@Celius Stingher 这正是我想要的。祝你有美好的一天。
  • 祝你有美好的一天,圣诞快乐!随时将我的答案标记为已接受,以便我们知道问题已解决!
【解决方案2】:

这可能会对您有所帮助:

final = []


df['NameCopy'] = df['Name'].str.lower()


for index,row in df.iterrows():
   if row['NameCopy'].find('ap.') != -1:
      final += [row['Name']]
   else:
      pass

print(final)

【讨论】:

  • 谢谢!这也有效。只要 StackOverflow 允许,我就会接受并批准答案。
  • 这是非常低效的,因为它在数据帧上循环,应该不鼓励。
  • 是的,同意@CeliusStingher:应该避免迭代。 stackoverflow.com/a/55557758/6660373btw 提前祝大家圣诞快乐 :)
  • @CeliusStingher:好点,但是如果在同一个迭代中需要循环更多的条件,这样的循环会更好。这就是为什么我更喜欢在我的数据集中使用这些。
  • 没有你需要满足的条件,并且已经多次证明有np.where()等条件的向量化处理方式。在处理 pandas dfs 时应避免和不鼓励使用 for 循环
【解决方案3】:

尝试:

df[df['Name'].str.match('^(ap[.])', case=False)].Name.unique() 

array(['Ap.ricot', 'AP.19'], dtype=object)

【讨论】:

  • 我喜欢在这里使用正则表达式 :) Merry Xmas :D +5
猜你喜欢
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多