DataFrame
df1 = pd.DataFrame({'key':['s','s','w','x','x','n','f','c'], 'data':range(8)})
1、不保留索引和列名
index表示设置是否保存索引(就是行号),header表示设置是否保存表头(就是列名) df.to_csv('./result.csv', index=False, header=False)
2、A value is trying to be set on a copy of a slice from a DataFrame
index = 0
for i in range(result.shape[0]):
if pd.isna(result.loc[i]['md5']):
#print(result.loc[i]['md5'])
#result.loc[i]['md5'] = hj[index] # 这样写会报错
result.loc[i, 'md5'] = hj[index]
index += 1
result.isna().any()
3、Python判断Nan值的五种方法(缺失值)
# 1、numpy判断
import numpy as np
nan = float('nan')
print(np.isnan(nan))
# 2、Math判断
import math
nan = float('nan')
print(math.isnan(nan))
# 3、Pandas判断
import pandas as pd
nan = float('nan')
print(pd.isna(nan))
# 4、利用Nan值不等于其自身判断
def is_nan(nan):
return nan != nan
nan = float('nan')
print(is_nan(nan))
# 5、只能输入数值型参数,Nan不属于任何取值区间
def is_nan(nan):
return not float('-inf') < nan < float('inf')
nan = float('nan')
print(is_nan(nan))
4、NumPy ndarray合并数组
import numpy as np
a =np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.append(a, b)
print(c)
# [1 2 3 4 5 6]
5、Numpy之ndarray的创建
arr = np.array([1,2,3,4,5])
arr1 = np.arange(1,6,1)
arr3 = np.zeros(3,dtype=int)
arr5 = np.ones(3,dtype=int)
arr7 = np.zeros_like(arr4)
arr8 = np.ones_like(arr7)
6、求解两个list列表的交集
if __name__ == '__main__':
# 主要有两种方法求解两个列表的交集
list1 = [1, 2, 3, 4]
list2 = [2, 3, 4, 5]
# 第一种方法: 遍历第一个列表的元素看是否存在于第二个列表中
res = [v for v in list1 if v in list2]
print(res)
# 第二种方法: 将列表转换为集合并且使用集合操作符得到两个集合的交集, 然后再转换为列表类型
list1 = [1, 2, 3, 4]
list2 = [2, 3, 4, 5]
# &求解两个集合的交集
res = list(set(list1) & set(list2))
print(res)
7、dataframe转list
import pandas as pd
# 1.dataframe转list
a = pd.DataFrame([[1,2,3],[4,5,6]],columns=['one', 'two', 'three'],index=['a','b'])
#b是数组,c是列表
b = a.values
c = b.tolist()
print(a)
print('-------分割线------')
print(c)
8、list转dataframe
import pandas as pd
# 2.list转dataframe
a2 = [[1,2,3],[4,5,6]]
b2 = pd.DataFrame(a2)
print('-------分割线------')
print(a2)
print(b2)
9、删除指定列值的行
https://www.zhihu.com/question/503436262
1.用 .drop 方法删除 Pandas Dataframe 中列值的行
.drop方法接受一个或一列列名,并删除行或列。对于行,我们设置参数axis=0,对于列,我们设置参数axis=1(默认情况下,axis为0)。
import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
('Mango', 24, 'No' ) ,
('banana', 14, 'No' ) ,
('Apple', 44, 'Yes' ) ,
('Pineapple', 64, 'No') ,
('Kiwi', 84, 'Yes') ]
#Create a DataFrame object
df = pd.DataFrame(fruit_list, columns =
['Name' , 'Price', 'Stock'])
# Get names of indexes for which column Stock has value No
indexNames = df[ df['Stock'] == 'No' ].index
# 基于多个列值删除行
indexNames = df[ (df['Price'] >= 30)
& (df['Price'] <= 70) ].index
# Delete these row indexes from dataFrame
df.drop(indexNames , inplace=True)
# 一行简写
df.drop(df.loc[df['Stock']=='Yes'].index, inplace=True)
print(df)
2.布尔屏蔽方法删除 Pandas DataFrame 中的行
print(df[df.Price > 40])
print('............................')
print(df[(df.Price > 40) & (df.Stock== 'Yes')])
10、删除行列
https://blog.csdn.net/m0_52829559/article/details/119063896
# 删除索引为1的行
dftest = df.drop(1, axis=0)
# 或者使用index
dftest = df.drop(index = 1) # axis = 0可以不写,drop函数默认是0
# 删除多个索引,1和2的行
dftest = df.drop([1,2],axis = 0)
# 使用index删除多个索引1和2的行
dftest = df.drop(index = [1,2])
# 通过columns指定列名删除多个列'id'和'Color'
dftest = df.drop(columns=['id','Color'])
# 删除Color列
dftest = df.drop('Color',axis = 1) # axis = 1表示删除列,不可省略
# 将要删除的id好弄成一个list
droplist = ['001','004','005']
# 选出df中id不在droplist中的行
# id在droplist中的,然后取负,表示不在里面的
dftest = df.loc[~df.id.isin(droplist)]
dftest = df.query('@droplist not in id') # 查找droplist不在id中的
11、读取数据无列名
获取数据内容。pandas.read_csv(“data.csv”)默认情况下,会把数据内容的第一行默认为字段名标题。所以我们要给它加列名或者让它以为没有列索引。
df = pd.read_csv("../data/data.csv", header=None)
# 设置表头
names = ["US0","US1","US2","US3","US4","Class"]
# 读入数据 (没有属性行:header=None)
df = pd.read_csv("../data/data.csv", names=names)
12、AttributeError: ‘Timestamp‘ object has no attribute ‘weekday_name‘/pandas.errors.InvalidIndexError
是因为weekday_name已经被day_name函数替换了。
13、显示完整的数据
pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) train_dataset.take([1, 6])
14、pandas DataFrame 缺失值处理(数据预处理)
查看df中各字段是否存在缺失值
print(df.isna().any())
print("------------")
print(df.isnull().any())
print("------------")
print(np.isnan(df).any())
用info()方法查看非空值情况 (推荐)
df.info()
用dropna() 方法直接丢弃含有缺失值的数据
test = df.dropna()
填充法
可以用某些数值来填充缺失值,如指定用数值0填充,或者是更常用的用前后值填充、均值填充、众数填充等。
print(df.fillna(method='ffill'))#用前一个值填充
print(df.fillna(method='backfill'))#用后一个值填充
d = pd.DataFrame(np.arange(9).reshape(3,3),index = [0,1,3])
d = d.reindex(index = range(5))
print(d)
print(d.fillna(d.mean()))#每列的均值填充
15、pandas多表合并的方法
横向合并
from functools import reduce
dfs = [df0, df1, df2, dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on=‘name’), dfs)
纵向连接
pd.concat([s1,s2,s3])
16、解决Windows下UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0错误的方法
# coding=utf-8
def check_charset(file_path):
import chardet
with open(file_path, "rb") as f:
data = f.read(4)
charset = chardet.detect(data)['encoding']
return charset
your_path = 你的文件路径
with open(your_path, encoding=check_charset(your_path)) as f:
data = f.read()
print(data)
结果引入新的错误: Python 编码问题,UnicodeDecodeError: 'ascii' codec can't decode byte/encode characters
未解决,使用捕获异常过滤处理。
17、查看数据类型以及类型转换
print(df.dtypes) print('-----') print(df['id'].dtypes)#如果一列中含有多个类型,则该列的类型会是object,同样字符串类型的列也会被当成object类型.
对于创建DataFrame的情形
如果要创建一个DataFrame,可以直接通过dtype参数指定类型:
df = pd.DataFrame(a, dtype='float') #示例1
df = pd.DataFrame(data=d, dtype=np.int8) #示例2
df = pd.read_csv("somefile.csv", dtype = {'column_name' : str})
18、DataFrame筛选出指定列值的行
18-1、布尔索引
df[df['code'] == '000002.SZ'] # 判断等式是否成立 df.loc[df['code']=='000002.SZ']
18-2、位置索引
mask = df['code'] == '000002.SZ'
pos = np.flatnonzero(mask)
df.iloc[pos]
# 直接根据索引取值
df.iloc[1:2]
18-3、标签索引
适用于DataFrame的行列都是有标签的情形。
# 把要操作的列作为索引
df.index=df['code'] # 将code列作为DataFrame的行索引
df.loc['000002.SZ', :] # 注意,这种根据索引iloc得到的结果不是DataFrame类型,而是Series
18-4、使用API
适用于数据量比较大的情形,方法为:pd.DataFrame.query。
df.query('code=="000002.SZ"')
# 多条件
df.query('code=="000002.SZ" | code=="000006.SZ"')
19、去掉dataframe的换行符
在比赛中把matrix矩阵数据存储后训练时出现换行符,想找个方法把换行符去掉。
找了一大圈,根本没有找到可靠的方法。现在想起来,如果去掉换行符后,不就是一行的数据吗?干嘛在存储之前要转换成多维数组呢?改成一维数组不就行了。
20、Python pandas 按行、按列遍历DataFrame
https://blog.csdn.net/weixin_43115411/article/details/126030711
20-1、按行遍历
data = {'a': {'x': [1, 1], 'y': [2, 1], 'z': [3, 1]},
'b': {'x': [1, 2], 'y': [2, 2], 'z': [3, 2]},
'c': {'x': [1, 3], 'y': [2, 3], 'z': [3, 3]}}
data_pd = pd.DataFrame(data)
print(data_pd)
for row in data_pd.index:
print(data_pd.loc[row]['a'])
for row_id in range(data_pd.shape[0]):
print(data_pd.iloc[row_id]['a'])
for index, row in data_pd.iterrows():
print(row['a'])
20-2、按列遍历
data = {'a': {'x': [1, 1], 'y': [2, 1], 'z': [3, 1]},
'b': {'x': [1, 2], 'y': [2, 2], 'z': [3, 2]},
'c': {'x': [1, 3], 'y': [2, 3], 'z': [3, 3]}}
data_pd = pd.DataFrame(data)
print(data_pd)
for col in data_pd.columns:
print(data_pd[col].iloc[0])
for index, col in data_pd.iteritems():
print(col.iloc[0])
21、使用DataFrame.query根据其字符串长度过滤字符串数据
df.query('A.str.len() != "3"')
如果要将np.nan删除为3个字符的字符串(NaN):
df.query('A.astype("str").str.len() != "3"')
22、使用dataframe.query从pd.DataFrame中包含的列表中选择值
列名User Color,其值需要包含有my_list则留下。
my_list = ['red', 'blue', 'green', 'yellow']
df.query("`User Color`.str.contains('|'.join(@my_list))")