Python Pandas:以编程方式向列名添加后缀,同时在concat之后删除公共列

Python Pandas:以编程方式向列名添加后缀,同时在concat之后删除公共列,python,pandas,Python,Pandas,我有3个数据帧,其中几列是相同的。我想让其中一些与众不同。剩下的部分应该放弃 df1.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type'] df2.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type'] d

我有3个数据帧,其中几列是相同的。我想让其中一些与众不同。剩下的部分应该放弃

df1.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type']
df2.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type']
df3.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type']
df4.columns = ['payeeId', 'name','amount','Category','Rule_No','Short Rule Name','Incident','Flag_Type']
现在我希望
短规则名称
事件
规则编号
标志类型
用后缀重命名,比如df1、df2和df3。剩余的列可以从组合df中删除

如果我这样做:

dfs = [df1,df2,df3]
df_f = pd.concat(dfs,axis=1)
df_f = df_f.loc[:,~df_f.columns.duplicated()]
这将删除所有重复的列,并留下一组列(对于df1)

因此,防止不必要的列删除的一种方法是如上所述重命名选定的列


我怎样才能达到同样的效果。我希望以编程方式向这些选定的列添加后缀。

您可以使用旧列的内容和新标签添加新列,如:

df1["Short Rule Name df1"] = df1["Short Rule Name"]
然后使用drop()删除旧列

要以编程方式执行,可以在for循环中弹出它

dfs = [df1, df2, df3]
i=1
for df in dfs:
    df["Short Rule Name df" + str(i)] = df["Short Rule Name"]
    df.drop("Short Rule Name", axis=1, inplace=True)
    i+=1

您可以使用计数器的
枚举
从列表理解中的列表中重命名
列:

cols = ["Short Rule Name", "Incident", "Rule_No", "Flag_Type"]
dfs = [df1, df2, df3]
dfs = [df.rename(columns=dict(zip(cols, [f'{x}_{i}' for x in cols]))) 
       for i, df in enumerate(dfs, 1)]

df_f = pd.concat(dfs,axis=1)
df_f = df_f.loc[:,~df_f.columns.duplicated()]
第一部分的样本:

cols = ["Short Rule Name", "Incident", "Rule_No", "Flag_Type"]

df1 = pd.DataFrame(columns=cols)
df2 = pd.DataFrame(columns=cols + ['a', 'b'])
df3 = pd.DataFrame(columns=cols + ['a', 'c'])
df4 = pd.DataFrame(columns=cols + ['b', 'c'])
dfs = [df1, df2, df3, df4]

dfs = [df.rename(columns=dict(zip(cols, [f'{x}_{i}' for x in cols]))) 
       for i, df in enumerate(dfs, 1)]

print (dfs)
[Empty DataFrame
Columns: [Short Rule Name_1, Incident_1, Rule_No_1, Flag_Type_1]
Index: [], Empty DataFrame
Columns: [Short Rule Name_2, Incident_2, Rule_No_2, Flag_Type_2, a, b]
Index: [], Empty DataFrame
Columns: [Short Rule Name_3, Incident_3, Rule_No_3, Flag_Type_3, a, c]
Index: [], Empty DataFrame
Columns: [Short Rule Name_4, Incident_4, Rule_No_4, Flag_Type_4, b, c]
Index: []]

您好,先生,希望您做得很好。如果您取消删除关于这个问题的答案@AnuragDabas,这将对我非常有帮助-我认为正则表达式应该很慢,所以这是删除的原因。但是先生,与
str.findall()相比,这确实是一个很好的方法
如果可能的话,请您取消删除2-3分钟,因为这对我学习新东西真的很有帮助:)@AnuragDabas-当然,这是另外一件事。@jezrael:如果我有4个dfs和3个列…会不会
zip()
起作用?