【问题标题】:Concatenating a string with part of another string in Python在 Python 中将一个字符串与另一个字符串的一部分连接起来
【发布时间】:2018-04-03 01:36:55
【问题描述】:

问题:

我有一个 csv 文件,其中一列中包含部分城市名称(通常缺少前一个或两个字母),以及同一文件中的另一列,其中包含其他信息并且通常最后包含一两个缺少的字母那个字符串。

例如 第 1 列 纽约

第 3 列 词词Ne

我关于如何解决这个问题的逻辑是拥有一个具有有效城市名称的单独 CSV 文件,并执行 VLOOKUP 前后连接的 Python 版本,以便它仅在尚未与有效城市匹配时进行连接数据。

我被困在如何从第 3 列(子字符串,但重复向下一列)的字符串末尾实际提取一个或两个字符并将其与第 1 列中字符串的开头合并,但我已经知道如何执行我的其余想法。

这是使用 Pandas 进行连接的通用脚本:

pd.concat([col1, col2.set_axis(col1.index[-len(col2):], inplace=False)], axis=1)

添加 -2 会解决问题吗?即

pd.concat([col1, col2.set_axis(col1.index[-len(col2)-2:], inplace=False)], axis=1)

谢谢!

【问题讨论】:

  • 如果您创建Minimal, Complete, and Verifiable 示例,您将获得更多更好的答案。尤其要确保输入和预期的测试数据是完整的(不是伪数据),并且可以很容易地剪切和粘贴到编辑器中,以便测试建议的解决方案。
  • 您打算如何解析 CSV 文件?熊猫?标准库csv 模块?还有什么?如果您使用csv 模块,“重复向下一列”仅表示“每一行”。在通常的for row in csv.reader(infile): 循环中,您可以执行row[1] = row[1][:2] + row[3] 或任何您想要的操作,然后像往常一样将其传递给writer.writerow(row)

标签: python concatenation


【解决方案1】:

如果您决定使用 Pandas,则在将 csv 加载到 pandas 数据框后,您可以通过这种方式从第 3 列中提取最后 1 或 2 个字符,然后以这种方式将其添加到第 2 列:

df_city_names['col3'].map(lambda x: "".join(str(x)[-(2 if len(str(x)) > 1 else 1 if len(str(x)) > 0 else ''):])) + df_city_names['col2']

【讨论】:

  • 谢谢。该行是自迭代的,还是我需要将其作为 for 循环的一部分包含在内,以便它为每一行执行此操作?
  • 嗨!它是自我迭代的。它用这个 lambda 映射 df_city_names['col3'] 的每一行。
  • 您好,我已经编写了一些示例代码,但是太长了,无法作为评论发布。简而言之,您编写的 map 函数是否实际上更新了第 2 列,还是仅打印了一个前置版本作为输出?您提到我需要事先将 csv 作为 pandas 数据框导入,我已经这样做了。 map 函数会预先存储在数据帧或 csv 等中的信息吗?它与 vlookup 相关,并在此“映射”步骤之后将输出写入文件。
  • 嗨!它不更新它。它只打印它。您可以通过在左侧添加 df_city_names['col4'] = 将其存储为单独的列,或者通过添加 df_city_names['col3'] = 来更新 col3
  • 另外,我看到你编辑了这个问题。请注意,pandas.concat 不会通过将每个值附加到传递的参数列中来创建合并列。它宁可'cbind's 或'rbind's 他们。因此,除非 'cbind' 是您的目标,否则 pd.concat 不是您所需要的。
猜你喜欢
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2020-10-01
  • 2017-03-25
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多