【问题标题】:Doing Pandas properly... rather than using a loop正确地做熊猫......而不是使用循环
【发布时间】:2017-06-25 18:54:05
【问题描述】:

我刚刚开始使用 Pandas,我发现很难像对待数据帧一样对待数据帧。时不时地,如果不遍历行,我就无法弄清楚如何做某事。

例如,我有一个包含预算信息的数据框。我想从“简短描述”中提取“供应商”,这是三种可能形式之一的字符串:

  1. blah blah blah 到 供应商名称
  2. blah blah blah 在供应商名称
  3. 供应商名称

我可以使用以下代码做到这一点,但我不禁觉得它没有正确使用 Pandas。有什么改进的想法吗?

for i, row in dataframe.iterrows():
    current = dataframe['short description'][i]
    if 'to' in current:
        point_of_break = current.index('to') + 3
        dataframe['vendor'][i] = current[point_of_break:]
    elif 'at' in current:
        point_of_break = current.index('at') + 3
        dataframe['vendor'][i] = current[point_of_break:]
    else:
        dataframe['vendor'][i] = current

【问题讨论】:

  • 您可以尝试使用正则表达式 - 查看pandas.pydata.org/pandas-docs/stable/text.html 了解支持正则表达式的方法。
  • 每一行是否包含引号中的供应商名称,或者您只是使用引号来指示供应商名称在每个字符串中的位置?
  • 我不是这个意思!我的错。我将更新原始问题以使其更清晰。

标签: python pandas dataframe


【解决方案1】:

我认为您可以通过toat 使用str.split,然后通过str[-1] 选择列表的最后一个值:

我实现了这个solution

df = pd.DataFrame({'A':['blah blah blah to "vendor name"',
                        'blah blah blah at "vendor name"',
                        '"vendor name"']})
print (df)

                                 A
0  blah blah blah to "vendor name"
1  blah blah blah at "vendor name"
2                    "vendor name"

print (df.A.str.split('[at|to]\s+'))
0    [blah blah blah t, "vendor name"]
1    [blah blah blah a, "vendor name"]
2                      ["vendor name"]
Name: A, dtype: object

df['vendor'] = df.A.str.split('(at|to) *').str[-1]
print (df)
                                 A          vendor
0  blah blah blah to "vendor name"   "vendor name"
1  blah blah blah at "vendor name"   "vendor name"
2                    "vendor name"   "vendor name"

替代使用:

df['vendor'] = df.A.str.split('[at|to]\s+').str[-1]
print (df)
                                 A         vendor
0  blah blah blah to "vendor name"  "vendor name"
1  blah blah blah at "vendor name"  "vendor name"
2                    "vendor name"  "vendor name"

【讨论】:

  • 非常好。可能比我的答案更好,因为它更简单
  • 这看起来可行!好东西。有什么理由让我选择你们的一种解决方案而不是另一种?
  • 它更简单,但取决于您。感谢您的接受!
猜你喜欢
  • 2019-03-30
  • 2021-12-11
  • 2023-03-17
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2018-12-11
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多