Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除特定列_Python_Pandas - Fatal编程技术网

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很乐意帮忙!很抱歉再次打扰您,但是对于line
pattern=r'GEO'
,如果我想查看多个名称,该如何格式化?我尝试了
pattern=[r'GEO',HD0']
并得到了一个不可损坏的类型:“list”。目前,我只是为了
HD0
再次重写代码,所以这不是一个大问题,只是想看看是否有可能循环它或列出多个值来清理代码。再次感谢@BoniPhila您可以在Python中查找有关正则表达式的更多信息。由于您希望列与GEO或HD0匹配,因此可以使用
操作符,这意味着
,这样模式将变成
r'GEO | HD0'
,谢谢!我已经好几年没接触python了,所以它正在尝试重新学习所有的基础知识。谢谢!就是这样!!非常感谢@HS-nebula@BoniPhila很乐意帮忙!对不起打扰了