【发布时间】: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