使用Pandas在CSV文件中的特定位置添加多列

2024-09-29 23:16:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我可以使用以下命令在固定位置插入列:

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

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

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

我尝试使用:

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

然而,可以猜测,这是行不通的

据我所知,pandas在迭代方法方面效率不高?我在这里被误导了吗

写这篇文章也让我想到它需要一个记分1、2、3的计数器

如有任何建议,将不胜感激

提前谢谢

更新——基于提供的反馈

使用@SergeBallesta works的方法。

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

使用@jacosoli的方法 我需要做一个修改,允许它找到所有以“确定”开头的列。还需要自动添加分数1、分数2、分数3

版本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,然后在第一个“确定性”列之后添加其余的。因此,它不会继续寻找下一个。也许它需要一个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

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


Tags: columns方法in文本dfforcol分数
2条回答

您必须在列上进行迭代。它的性能不如numpy矢量化访问,但有时您别无选择:

在这里,我只想做:

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

您可以像下面这样找到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问题

相关问题 更多 >

    热门问题