pandas 数据排序、填充、精度、错位、时间

    1. 数据排序、填充方式
    1. Nan值都用0替换
    1. 检查数据中是否有NaN
    1. 索引数据及其获取
    1. DataFrame.resample()根据时间聚合采样
    1. 小数位数 精度的处理方法
    1. 数据错位处理
    1. 添加一列数据 在指定位置上
    1. 截取时间段
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

  1. 查看每一列是否有NaN:
    df.isnull().any(axis=0)
  2. 查看每一行是否有NaN:
    df.isnull().any(axis=1)
  3. 查看所有数据中是否有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

你可能感兴趣的:(pandas 数据排序、填充、精度、错位、时间)