删除特定的列熊猫

时间:2019-03-26 19:20:55

标签: python pandas

我有以下代码:

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.....,然后将与另一个合并的csv文件J1_01,J1_02,J2_01,J2_02,J3_01....重复,所有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特定的重复项?谢谢!作为后续问题,是否有人愿意提供帮助,如果我想用下划线替换每个列(“:”,“;”或空格)中存在的特定字符,是否可以用熊猫来做到这一点?再次感谢!

Edit: Here's a screenshot of the merged csv file.

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

1 个答案:

答案 0 :(得分:0)

从您的图像看来,您要保留的列似乎是以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的所有列,这就是为什么我们必须按索引而不是按名称删除列的原因。

相关问题