python - 删除特定列熊猫
问题描述
我有以下代码:
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
谢谢!作为一个后续问题,如果有人愿意提供帮助,如果我想用下划线替换每列中存在的特定字符(“:”,“;”或空格),有没有办法用熊猫来做到这一点?再次感谢!
我想保留“GEO.id”、“GEO.id2”和“Geo.displ”的第一个实例,并在这三列重复时删除。
解决方案
从您的图像看来,您要保留的列是以 . 开头的列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
,这就是为什么我们必须按索引而不是它们的名称来删除列。