使用 Pandas 在 CSV 文件的特定位置添加多列
Adding Multiple Columns at Specific Locations in CSV file using Pandas
我试图在名称以特定文本开头的列之前放置多个列(Score1、Score2、Score3 等),例如:确定性。
我可以使用以下方法在固定位置插入列:
df.insert(17, "Score1", " ")
添加一列然后更改列顺序,因此我将不得不查看下一列的位置。我可以将空白列列表添加到 CSV 的末尾。
基本上,我的理解是我必须 pandas 才能阅读专栏 header。如果 header 文本以 "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
我已经发布了这个,以防有人遇到同样的需求。
您将不得不遍历列。它的性能不如 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]
)列表就不需要更新列索引。
如果您还没有,也可以看看 问题。
我试图在名称以特定文本开头的列之前放置多个列(Score1、Score2、Score3 等),例如:确定性。
我可以使用以下方法在固定位置插入列:
df.insert(17, "Score1", " ")
添加一列然后更改列顺序,因此我将不得不查看下一列的位置。我可以将空白列列表添加到 CSV 的末尾。
基本上,我的理解是我必须 pandas 才能阅读专栏 header。如果 header 文本以 "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
我已经发布了这个,以防有人遇到同样的需求。
您将不得不遍历列。它的性能不如 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]
)列表就不需要更新列索引。
如果您还没有,也可以看看