-
- 数据排序、填充方式
-
- Nan值都用0替换
-
- 检查数据中是否有NaN
-
- 索引数据及其获取
-
- DataFrame.resample()根据时间聚合采样
-
- 小数位数 精度的处理方法
-
- 数据错位处理
-
- 添加一列数据 在指定位置上
-
- 截取时间段
import pandas as pd
from pandas.tseries.offsets import Day
import numpy as np
1. 数据排序、填充方式
插值方法:
- ffill 空值取前面的值
- bfill 空值取后面的值
- interpolate 线性取值
ts = pd.Series(range(10), pd.date_range('07-10-16', periods = 10, freq = 'D'))
print(ts)
day3Ts = ts.resample('3D').mean()
print(day3Ts)
print('=======降序处理===========')
everyDay = day3Ts.resample('D').asfreq()
print(everyDay)
print('=======填充处理-后置填充===========')
frontValue = day3Ts.resample('D').ffill(1)
print(frontValue)
# 填充数据时,使用哪个线性值来解决
linerValue = day3Ts.resample('D').interpolate()
print(linerValue)
结果:
2016-07-10 0
2016-07-11 1
2016-07-12 2
2016-07-13 3
2016-07-14 4
2016-07-15 5
2016-07-16 6
2016-07-17 7
2016-07-18 8
2016-07-19 9
Freq: D, dtype: int64
2016-07-10 1
2016-07-13 4
2016-07-16 7
2016-07-19 9
Freq: 3D, dtype: int64
=======降序处理===========
2016-07-10 1.0
2016-07-11 NaN
2016-07-12 NaN
2016-07-13 4.0
2016-07-14 NaN
2016-07-15 NaN
2016-07-16 7.0
2016-07-17 NaN
2016-07-18 NaN
2016-07-19 9.0
Freq: D, dtype: float64
=======填充处理-后置填充===========
2016-07-10 1.0
2016-07-11 1.0
2016-07-12 NaN
2016-07-13 4.0
2016-07-14 4.0
2016-07-15 NaN
2016-07-16 7.0
2016-07-17 7.0
2016-07-18 NaN
2016-07-19 9.0
Freq: D, dtype: float64
2016-07-10 1.000000
2016-07-11 2.000000
2016-07-12 3.000000
2016-07-13 4.000000
2016-07-14 5.000000
2016-07-15 6.000000
2016-07-16 7.000000
2016-07-17 7.666667
2016-07-18 8.333333
2016-07-19 9.000000
Freq: D, dtype: float64
2. Nan值都用0替换
指定某一列数据替换
所有的Nan值都用0替换:
第一种
df.fillna(0)
第二种:或者使用这个
df.fillna(0, inplace=True)
ts1 = [0, 1, np.nan, np.nan, np.nan, np.nan]
ts2 = [0, 2, np.nan, 3, np.nan, np.nan]
d = {'X': ts1, 'Y': ts2, 'Z': ts2}
df = pd.DataFrame(data=d)
print(df)
'''
X Y Z
0 0.0 0.0 0.0
1 1.0 2.0 2.0
2 NaN NaN NaN
3 NaN 3.0 3.0
4 NaN NaN NaN
5 NaN NaN NaN
'''
print('============Nan值都用0替换================')
print(df.fillna(0))
# 或者使用这个
print(df.fillna(0, inplace=False))
col =['X','Y'] # 或者col =['X']
df[col] = df[col].ffill()
print(df)
'''
X Y Z
0 0.0 0.0 0.0
1 1.0 2.0 2.0
2 1.0 2.0 NaN
3 1.0 3.0 3.0
4 1.0 3.0 NaN
5 1.0 3.0 NaN
'''
X Y Z
0 0.0 0.0 0.0
1 1.0 2.0 2.0
2 0.0 0.0 0.0
3 0.0 3.0 3.0
4 0.0 0.0 0.0
5 0.0 0.0 0.0
X Y Z
0 0.0 0.0 0.0
1 1.0 2.0 2.0
2 0.0 0.0 0.0
3 0.0 3.0 3.0
4 0.0 0.0 0.0
5 0.0 0.0 0.0
3. # 检查数据中是否有NaN
- 查看每一列是否有NaN:
df.isnull().any(axis=0)- 查看每一行是否有NaN:
df.isnull().any(axis=1)- 查看所有数据中是否有NaN最快的:
df.isnull().values.any()
3.1 判断某列是否有NaN
ss = df['X'].isnull().any() # # 判断open这一列列是否有 NaN
print(ss) # False
3.2 判断某列是否全部为NaN
df['$open'].isnull().all() # 判断open列是否全部为NaN
df.isnull().all() # 判断某列是否全部为NaN
4. 索引数据及其获取
stock_train = csv_data['2000':'2020'] #根据时间截取数据
# 获取索引本身到新列中
floodSeasonData['baseline_time'] = floodSeasonData.index.tolist()
5. DataFrame.resample()根据时间聚合采样
df.resample()后面最好跟个东西,否则结果并不一定是你想要的。
df.resample('D').asfreq()
https://blog.csdn.net/brucewong0516/article/details/84768464
6. 小数位数 精度的处理方法
控制台打印时显示的2位小数:
pd.set_option('precision', 2)
实际修改数据精度:
官例:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.round.html
>>> df = pd.DataFrame(np.random.random([3, 3]),
... columns=['A', 'B', 'C'], index=['first', 'second', 'third'])
>>> df
A B C
first 0.028208 0.992815 0.173891
second 0.038683 0.645646 0.577595
third 0.877076 0.149370 0.491027
>>> df.round(2)
A B C
first 0.03 0.99 0.17
second 0.04 0.65 0.58
third 0.88 0.15 0.49
>>> df.round({'A': 1, 'C': 2})
A B C
first 0.0 0.992815 0.17
second 0.0 0.645646 0.58
third 0.9 0.149370 0.49
>>> decimals = pd.Series([1, 0, 2], index=['A', 'B', 'C'])
>>> df.round(decimals)
A B C
first 0.0 1 0.17
second 0.0 1 0.58
third 0.9 0 0.49
7. 数据错位处理
print(df['Z'].shift(2))
print(df[['X','Y']])
rng = pd.date_range("2018-6-24", periods=4, freq="W")
ts = pd.Series(range(len(rng)), index=rng)
print(ts)
print(ts.shift(1))
print(ts.shift(2, freq=Day()))
# 可以看到,现在日期索引移动了 2 天的间隔。通过 tshift 同样可以达到相同的效果。
print(ts.tshift(2, freq=Day()))
0 NaN
1 NaN
2 0.0
3 2.0
4 NaN
5 3.0
Name: Z, dtype: float64
X Y
0 0.0 0.0
1 1.0 2.0
2 1.0 2.0
3 1.0 3.0
4 1.0 3.0
5 1.0 3.0
2018-06-24 0
2018-07-01 1
2018-07-08 2
2018-07-15 3
Freq: W-SUN, dtype: int64
2018-06-24 NaN
2018-07-01 0.0
2018-07-08 1.0
2018-07-15 2.0
Freq: W-SUN, dtype: float64
2018-06-26 0
2018-07-03 1
2018-07-10 2
2018-07-17 3
Freq: W-TUE, dtype: int64
2018-06-26 0
2018-07-03 1
2018-07-10 2
2018-07-17 3
Freq: W-TUE, dtype: int64
8. 添加一列数据 在指定位置上
Pandas数据的更改、插入新增的列和行的方法
9. 截取时间段
stock_train = df
every_year_data = stock_train.resample('Y').mean()
print('读取指定列索引字段的数据')
#print(every_year_data)
time_list = every_year_data.index.tolist()
first_year = str(time_list[0]).strip().split('-')[0]
first_year_data = stock_train[first_year+'-06':first_year+'-9']
for line in time_list[1:]:
every_year = str(line).strip().split('-')[0]
second_year = stock_train[every_year + '-06':every_year + '-9']
first_year_data = pd.concat([first_year_data, second_year],axis=0)
#print(first_year_data)
return first_year_data
https://blog.csdn.net/weixin_41685388/article/details/103860881