首页 > 解决方案 > 删除特定列熊猫

问题描述

我有以下代码:

dfs = glob.glob(path + "/*.csv") 
df = pd.concat([pd.read_csv(df) for df in dfs], axis=1, ignore_index=False)
df1 = df.loc[:,~df.columns.duplicated()]
df1.to_csv("userpath.csv")

此代码的目的是从同一数据库中获取随机/多个 csv 文件,并将它们彼此相邻地合并在一起。这些文件都有相同的行,但列名不同,但第一行的代码相同。例如,一个 csv 文件将具有J1_01,J1_02,J2_01,J2_02.....,然后它将与另一个合并J1_01,J1_02,J2_01,J2_02,J3_01....的 csv 文件重复所有 csv 文件将具有不同的列。第二行提供列值的标题描述。每个 csv 文件都有三列,给出行名称和行 ID 号的描述,例如:Id, Id2, Label Name. 我想保留这三个的第一个实例并删除剩余的重复项。但是我使用了代码df.loc[:,~df.columns.duplicated()],因为J1_01,J1_02,J2_01,J2_02,J3_01....随着新的 csv 文件被合并,最终会重复,我会丢失一些列。有没有办法指定代码在保留前三个后df.loc[:,~df.columns.duplicated()]只删除三个特定的重复项?Id, Id2, Label Name谢谢!作为一个后续问题,如果有人愿意提供帮助,如果我想用下划线替换每列中存在的特定字符(“:”,“;”或空格),有没有办法用熊猫来做到这一点?再次感谢!

编辑:这是合并的 csv 文件的屏幕截图。

我想保留“GEO.id”、“GEO.id2”和“Geo.displ”的第一个实例,并在这三列重复时删除。

标签: pythonpandas

解决方案


从您的图像看来,您要保留的列是以 . 开头的列GEO。为此,您可以使用regex匹配名称,然后获取这些列的索引,然后根据列索引拼接数据框。

import re

pattern = r'GEO' # or just "id" or whatever pattern best matches your data

# Returns list of indices that match your pattern
match_idx = [i for i, e in enumerate(df.columns) if re.search(pattern, e)]

# Select all but the first two columns (since you want to keep those)
drop_cols = match_idx[2:]

# Now choose all columns that don't match the indices of the columns you're dropping
usecols = [idx for idx, e in enumerate(df.columns) if idx not in drop_cols]

# Then select your data
df1 = df.iloc[:, usecols]

注意:如果您尝试选择单个列,如df['GEO.id'],它将返回所有名为 的列GEO.id,这就是为什么我们必须按索引而不是它们的名称来删除列。


推荐阅读