【问题标题】:Adding Multiple Columns at Specific Locations in CSV file using Pandas使用 Pandas 在 CSV 文件的特定位置添加多列
【发布时间】:2020-05-19 09:32:56
【问题描述】:

我试图在名称以特定文本开头的列之前放置多个列(Score1、Score2、Score3 等),例如:Certainty。

我可以使用以下方法在固定位置插入列:

df.insert(17, "Score1", " ")

添加一列然后更改列顺序,因此我必须查看下一列的位置。我可以在 CSV 的末尾添加一个空白列列表。

所以基本上,我的理解是我必须让 pandas 读取列标题。如果标题文本以“Certainty”开头,则在其前面放置一个名为 Score1 的列。

我尝试使用:

df.insert(df.filter(regex='Certainty').columns, "Score", " ")

但是,可以猜到它不起作用。

据我了解,pandas 在迭代方法上效率不高?我是不是被误导了?

写这个也让我认为它需要一个用于 Score1、2、3 的计数器。

任何建议将不胜感激!

提前致谢。

更新-----基于提供的反馈

使用@SergeBallesta 的方法有效。

cur=0
for i, col in enumerate(df.columns):
    if col.startswith('Certainty'):
        df.insert(i+cur, f'Score{cur + 1}', '')
        cur += 1

使用@JacoSolari的方法 我需要进行修改以允许它找到以“Certainty”开头的所有列。并且还需要自动添加Score1、Score2、Score3。

版本 1:这只会在正确的位置添加 Score1,然后没有其他内容

counter=0
certcol = df.columns[df.columns.str.contains('Certainty')]
col_idx = df.columns.get_loc(certcol[0])
col_names = [f'Score{counter + 1}']
[df.insert(col_idx, col_name, ' ') 
for col_name in col_names[::-1]]

版本 2:这会将 Score1 添加到正确的位置,然后将其余部分添加到第一个“Certainty”列之后。所以它不会继续寻找下一个。也许它需要一个for 循环?

cur=0
certcol = df.columns[df.columns.str.contains('Certainty')]
for col in enumerate(certcol):
    col_idx = df.columns.get_loc(certcol[0])
    df.insert(cur+col_idx, f'Score{cur + 1}', '')
    cur += 1

我已经发布了这个,以防有人偶然发现同样的需求。

【问题讨论】:

  • 给我们一些数据来玩
  • 你也可以把这行col_idx = df.columns.get_loc(certcol[0])放到循环之外。您不需要在每次迭代时都定义它(实际上它不依赖于迭代器)。另外,如果您发现它们有用,请不要忘记投票或接受答案:)
  • @JacoSolari,当我将col_idx 置于循环之外时。它只是将 Score 的所有迭代例如:Score1、Score2、Score3、......放在第一个“Certainty”列之后。所以它不做:Score1,Certainty1,Some column,Score2,Certainty2,另一列,Score3,Certainty3,而不是 Score1,Score2,Score3,Certainty1,Some column,Certainty2,另一列,Certainty3 我会继续坚持:)我也投了赞成票并接受了。

标签: python pandas csv multiple-columns


【解决方案1】:

您将不得不遍历列。它的性能不如 numpy 矢量化访问,但有时您别无选择:

在这里我会做:

cur = 0
for i, col in enumerate(df.columns):
    if col.startswith('Certainty')
        df.insert(i+cur, f'Score{cur + 1}', '')
        cur += 1

【讨论】:

  • 如果您的数据框包含大量列,这将非常低效,因为它必须迭代并检查所有列的if 条件。最好找到感兴趣列的索引并在那里添加新列。检查我的答案,它只迭代新列,而您提出的解决方案迭代原始数据框中的所有列。
  • 这很好,谢谢,只需要在if 语句的末尾添加一个冒号。我也在尝试为更大的数据集实现@JacoSolari 方法。
【解决方案2】:

您可以像这样找到Certainty 列的位置

col_idx = df.columns.get_loc('Certainty')

然后您可以像这样在 for 循环中添加每个新列和数据(这里只是空字符串,如您的示例)

col_names = ['1', '2', '3']
[df.insert(col_idx, col_name, '') for col_name in col_names[::-1]]

因此,只要添加新列的反向 ([::-1]) 列表,就不需要更新列索引。 如果您还没有,请查看this 问题。

【讨论】:

  • 感谢您的建议,如果所有列都仅称为“Certainty”,我已对其进行了修改以查找任何以“Certainty”开头的列。我会尽快发布我的变体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2018-03-08
  • 1970-01-01
  • 2017-06-10
  • 2019-04-27
  • 2021-12-17
  • 2022-11-10
相关资源
最近更新 更多