Python 删除特定列
我有以下代码:Python 删除特定列,python,pandas,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文件,并将它们相邻地合并在一起。这些文件都有相同的行和不同的列名,但第一行
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
特定副本后,只删除这三个副本?谢谢作为后续问题,如果有人愿意提供帮助,如果我想用下划线来替换每列中的特定字符(“:”、“;”或空格),有没有办法对熊猫进行替换?再次感谢
我想保留'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
的列,这就是为什么我们必须按索引而不是名称删除列的原因 从您的图像来看,您想要保留的列似乎是以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
的列,这就是为什么我们必须按索引而不是名称删除列的原因 您能否重命名CSV文件中的前3列,然后将其读入?然后像现在一样放下剩下的副本。对于第二个问题,请看。或者,您可以获取df.columns
的索引,然后选择所需列的索引,然后使用df.iloc[:,idxs]
获取所需数据。@HS nebula感谢您的链接!问题在于,对于J1_01、J1_02、J2_01、J2_02、J3_01……
,列名称各不相同。例如,按照代码模式,第一个csv文件可能有20列,但下一个csv文件可能只有2列,然后下一个csv文件可能有6列。永远不会是确切的数字。仅有的三个常量列是ID列,如ID、Id2、Label Name
。id列是我想去掉重复项的列,如果有意义的话,我想保留其他列。@HS nebula供您第二次回复。索引将根据文件夹中的csv文件而变化,因此它不总是相同的数字。根据csv文件的列数,它可能会始终更改。唯一保持不变的是ID列。好的,我想我明白了。你能发布两个CSV文件吗?你能重命名CSV文件中的前3列,然后读入吗?然后像现在一样放下剩下的副本。对于第二个问题,请看。或者,您可以获取df.columns
的索引,然后选择所需列的索引,然后使用df.iloc[:,idxs]
获取所需数据。@HS nebula感谢您的链接!问题在于,对于J1_01、J1_02、J2_01、J2_02、J3_01……
,列名称各不相同。例如,按照代码模式,第一个csv文件可能有20列,但下一个csv文件可能只有2列,然后下一个csv文件可能有6列。永远不会是确切的数字。仅有的三个常量列是ID列,如ID、Id2、Label Name
。id列是我想去掉重复项的列,如果有意义的话,我想保留其他列。@HS nebula供您第二次回复。索引将根据文件夹中的csv文件而变化,因此它不总是相同的数字。根据csv文件的列数,它可能会始终更改。唯一保持不变的是ID列。好的,我想我明白了。你能发布两个你的CSV文件吗?就是这样!!非常感谢@HS-nebula@BoniPhila很乐意帮忙!很抱歉再次打扰您,但是对于linepattern=r'GEO'
,如果我想查看多个名称,该如何格式化?我尝试了pattern=[r'GEO',HD0']
并得到了一个不可损坏的类型:“list”。目前,我只是为了HD0
再次重写代码,所以这不是一个大问题,只是想看看是否有可能循环它或列出多个值来清理代码。再次感谢@BoniPhila您可以在Python中查找有关正则表达式的更多信息。由于您希望列与GEO或HD0匹配,因此可以使用
操作符,这意味着或
,这样模式将变成r'GEO | HD0'
,谢谢!我已经好几年没接触python了,所以它正在尝试重新学习所有的基础知识。谢谢!就是这样!!非常感谢@HS-nebula@BoniPhila很乐意帮忙!对不起打扰了