文章目录
1. python处理重复值索引问题
python3 的index函数只能索引要查找元素的首个索引,这个在多数情况是不能满足索引要求的。
listA = [1, 2, 3, 2]
print(listA.index(2))
1
而enumerate函数可以遍历所有元素,可以利用这个函数+列表推导式实现获取所有重复元素的索引值。
listA = [1, 2, 3, 2] #比如要查找列表中的数字2。
indexA = [x for (x, m) in enumerate(listA) if m == 2]
print(indexA)
1,3
或
listA = [1, 2, 3, 2]
for (x, m) in enumerate(listA):
if m == 2:
print(x)
1
3
2.python读取文件夹列表的问题
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
但这样获取的文件名是没有顺序的。
单纯的filenames.sort()会以1,10,100,1000.。。这样的方式读入文件名。
因此,对于这种0.csv, 1.csv, 2.csv……10.csv文件列表,只需要在
filenames=os.listdir()下一行代码中加入
filenames.sort(key=lambda x:int(x[:-4]))
就可以解决顺序读取文件的问题了。
对于带字符串的,如下:
可以先把两边的字符去掉,对比数字排序即可:
path_list.sort(key=lambda x: int(x.split('r_theta_interp_')[1].split('.csv')[0]))
总之,就是去掉文件名多余字符,只剩下数字,排序,即可。
3. dataframe删除指定行、列
1)drop函数
df.drop() # drop删除行或列的内容
删除前两行
df.drop([0, 1])
删除最后一行
df.drop([len(list)-1])
删除行名为name的行
删除列名为name的列
df.drop(["name"]) # 默认删除行
df.drop(["name"], axis=1) # 列需要加axis=1
2)inplace参数
凡是会对原数组作出修改并返回一个新数组的,往往都有一个 inplace可选参数。如果手动设定为True(默认为False),那么原数组直接就被替换。
DF= DF.drop('column_name', axis=1);
DF.drop('column_name',axis=1, inplace=True)
采用inplace=True之后,原数组名(如2情况所示)对应的内存值直接改变;而采用inplace=False之后,原数组名对应的内存值并不改变,需要将新的结果赋给一个新的数组或者覆盖原数组的内存位置(如1情况所示)。
4. argsort数组索引排名到元素排名
对于数组元素进行索引排名时,可以使用np.argsort()返回索引排名,是按照索引从小到大,如下:
result = [9, 4, 3, 7]
# input result as a tuple
# result = np.array(result)
result_arg = np.argsort(result)
print(result_arg)
[2 1 3 0]
元素3最小,3对应的索引为2,排在第一个位置,元素9最大,索引为0,排在最后一个位置。
如果想要对元素进行排名:
result = [9, 4, 3, 7]
# input result as a tuple
result = np.array(result)
result_arg = np.argsort(result)
result_rank = np.zeros(len(result_arg))
for i in range(len(result_arg)):
result_rank[result_arg[i]] = i
print(result_rank.tolist())
[3.0, 1.0, 0.0, 2.0]
9最大,对应3.0, 3最小,对应0.0
或者,使用两次argsort()
result = [9, 4, 3, 7]
# input result as a tuple
result = np.array(result)
result_arg = np.argsort(result)
print(result_arg)
result_arg = np.argsort(result_arg) # 两次argsort和上面是一样的效果
print(result_arg)
[2 1 3 0] # 索引排名
[3 1 0 2] # 元素排名