微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas数据处理常用操作更新中

1.查看数据相关信息

df.info() #查看数据类型
df.shape #查看数据规模
df.describe() #数据统计信息描述

2.如何设置才能不隐藏DataFram的列?

pd.set_option("max_columns",100) #这里100可以调整:最大显示列数
pd.set_option('display.max_columns',None) #这种是都显示

3.如何将序列的索引转换成数据帧的列?

import numpy as np
import pandas as pd
mylist=list('abcdefghijklmnopqrstuvwxyz')
myarr=np.arange(26)
mydict=dict(zip(mylist,myarr))
ser=pd.Series(mydict)
df=ser.to_frame().reset_index()
df

4.怎样将两个Series组合成一个DateFrame

ser1=pd.Series(list('abcdefghijklmnopqrstuvwxyz'))
ser2=pd.Series(np.arange(26))
#solution1
df=pd.DataFrame({'col1':ser1,'col2':ser2})
#solution2
df=pd.concat([ser1,ser2],axis=1)
df.head()

在这里插入图片描述


5.如何给系列的索引命名

ser = pd.Series(list('abcedfghijklmnopqrstuvwxyz'))
ser.names='alphabets'
ser.head()

在这里插入图片描述


6.怎样得到系列A中的数据不包含序列B的数据

ser1=pd.Series([1,2,3,4,5])
ser2=pd.Series([4,5,6,7,8])
ser1[~ser1.isin(ser2)]

在这里插入图片描述


7.怎样找到序列A与序列B中的不同元素元素?

ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])
seru=pd.Series(np.union1d(ser1,ser2))#留下一个相同元素并合并
seri=pd.Series(np.intersect1d(ser1,ser2))#找到相同元素
seru[~seru.isin(seri)]
seru.head()

在这里插入图片描述


8.如何得到一个数字序列的最小值、第25个百分点、中间值、第75个百分点和最大值?

state=np.random.RandomState(100)#使用RandomState获得随机生成器,100为随机种子
ser=pd.Series(state.normal(10,5,25))
np.percentile(ser,q=[0,25,50,75,100])##求取ser序列第0%、25%....分位的数值

9.如何获得系列中唯一项目的频率计数?

ser = pd.Series(np.take(list('abcdefgh'), np.random.randint(8, size=30)))
ser.value_counts()

在这里插入图片描述


10.如何只保留前两个最常见的值,而将其他所有值替换为“Other”?

np.random.RandomState(100)
ser = pd.Series(np.random.randint(1, 5, [12]))#产生[1,5)的12个随机序列
print("Top 2 Freq:", ser.value_counts())#对Series里面的每个值进行计数并且排序。
ser[~ser.isin(ser.value_counts().index[:2])]='Other'
ser

在这里插入图片描述


11.如何将numpy数组转换为给定形状的数据帧?

import pandas as pd
import numpy as np
ser=pd.Series(np.random.randint(1,10,35))
df=pd.DataFrame(ser.values.reshape(7,5))
df

在这里插入图片描述


12.如何从数列中找出3的倍数的数字位置?

ser=pd.Series(np.random.randint(1,10,7))
#np.argwhere( a ) 
#返回非0的数组元组的索引,其中a是要索引数组的条件。
np.argwhere(ser % 3==0)

在这里插入图片描述


13.如何从序列中提取给定位置的内容?

ser = pd.Series(list('abcdefghijklmnopqrstuvwxyz'))
pos = [0, 4, 8, 14, 20]
ser.take(pos)

在这里插入图片描述


14.如何垂直和水平堆叠两个系列?

ser1 = pd.Series(range(5))
ser2 = pd.Series(list('abcde'))
# Vertical
ser1.append(ser2)

# Horizontal
df = pd.concat([ser1, ser2], axis=1)

15.如何在另一个系列B中获得系列A项目的位置?

ser1 = pd.Series([10, 9, 6, 5, 3, 1, 12, 8, 13])
ser2 = pd.Series([1, 3, 10, 13])
#np.where()返回满足条件的索引
#np.where(x>=5)[0] 输出的类型是一个元组元组的第一个元素是list
#tolist将序列转为列表
#1. np.where(condition, x, y)
#满足条件(condition),输出x,不满足输出y。

# Solution 1
[np.where(i == ser1)[0].tolist()[0] for i in ser2]
# Solution 2
[pd.Index(ser1).get_loc(i) for i in ser2]

16.如何将序列中每个元素的第一个字符转换为大写?

ser = pd.Series(['how', 'to', 'kick', 'ass?'])
# Solution 1
ser.map(lambda x: x.title())

# Solution 2
ser.map(lambda x: x[0].upper() + x[1:])

# Solution 3
pd.Series([i.title() for i in ser])

17.如何计算一个序列中每个单词的字符数?

ser = pd.Series(['how', 'to', 'kick', 'ass?'])
ser.map(lambda x: len(x))

18.如何计算一系列连续数之间的差值?

ser = pd.Series([1, 3, 6, 10, 15, 21, 27, 35])
#output
#[nan, 2.0, 3.0, 4.0, 5.0, 6.0, 6.0, 8.0]
#[nan, nan, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0]
print(ser.diff().tolist())
print(ser.diff().diff().tolist())

在这里插入图片描述


19.如何将一系列日期字符串转换成时间序列?

ser = pd.Series(['01 Jan 2010', '02-02-2011', '20120303', '2013/04/04', '2014-05-05', '2015-06-06T12:20'])
#sulution1
pd.to_datetime(ser)
#sulution2
from dateutil.parser import parse
ser.map(lambda x: parse(x))

在这里插入图片描述


20.如何从一系列日期字符串中获取月中的哪一天、周数、年中的哪一天和周中的哪一天?

ser = pd.Series(['01 Jan 2010', '02-02-2011', '20120303',
                 '2013/04/04', '2014-05-05', 
                 '2015-06-06T12:20'])
ser=pd.to_datetime(ser)
# day of month
ser.dt.day.tolist()
#week number
ser.dt.weekofyear.tolist()
#day of year
ser.dt.dayofyear.tolist()
#day of week
ser.dt.weekday_name.tolist()

在这里插入图片描述

21.如何将年-月字符串转换为对应于一个月第四天的日期?

ser = pd.Series(['Jan 2010', 'Feb 2011', 'Mar 2012'])
#output
#0   2010-01-04
#1   2011-02-04
#2   2012-03-04
ser=pd.to_datetime(ser)
ser

在这里插入图片描述


22.如何找到数字序列中的所有局部最大值(或峰值)?

ser = pd.Series([2, 10, 3, 4, 9, 10, 2, 7, 3])
#[-2  2  0  0 -2  2 -2]
dd = np.diff(np.sign(np.diff(ser)))
#np.diff(ser)
#[ 8 -7  1  5  1 -8  5 -4]
#np.sign(np.diff)  
#[ 1 -1  1  1  1 -1  1 -1]
peak_locs = np.where(dd == -2)[0] + 1
peak_locs

在这里插入图片描述


23.如何用最不频繁的字符替换字符串中丢失的空格?

my_str = 'dbc deb abed gade'
ser = pd.Series(list('dbc deb abed gade'))
#'dbccdebcabedcgade'  # least frequent is 'c'
freq = ser.value_counts()
least_freq = freq.dropna().index[-1] #找到最少频率的字母
"".join(ser.replace(' ', least_freq))

在这里插入图片描述


24.如何填充间歇时间序列,以便所有缺失的日期都显示以前未缺失的日期的值

ser = pd.Series([1,10,3,np.nan], index=pd.to_datetime(
    ['2000-01-01', '2000-01-03', '2000-01-06', '2000-01-08']))
print(ser)
#> 2000-01-01     1.0
#> 2000-01-03    10.0
#> 2000-01-06     3.0
#> 2000-01-08     NaN
#> dtype: float64
# Input
ser = pd.Series([1,10,3, np.nan], index=pd.to_datetime(
['2000-01-01', '2000-01-03', '2000-01-06', '2000-01-08']))

# Solution
ser.resample('D').ffill()  # fill with prevIoUs value

# Alternatives
ser.resample('D').bfill()  
# fill with next value
ser.resample('D').bfill().ffill() 
# fill next else prev value

25.如何创建一个数据帧,其中的行是从给定系列开始的步幅?

L = pd.Series(range(15))
def gen_strides(a, stride_len=5, window_len=5):
    n_strides = ((a.size-window_len)//stride_len) + 1
    return np.array([a[s:(s+window_len)] for 
        s in np.arange(0, a.size, stride_len)[:n_strides]])

gen_strides(L, stride_len=2, window_len=4)

在这里插入图片描述


26.如何用平均值替换多个数值列的缺失值?

df_out = df[['Min.Price', 'Max.Price']] = df[['Min.Price', 'Max.Price']].apply(lambda x: x.fillna(x.mean()))

27.如何更改数据帧的列顺序?

df = pd.DataFrame(np.arange(20).reshape(-1, 5), columns=list('abcde'))
df[list('cbade')]

在这里插入图片描述


28.如何将数据帧中的所有值格式化为百分比?

# Input
df = pd.DataFrame(np.random.random(4), columns=['random'])

# Solution
out = df.style.format({
    'random': '{0:.2%}'.format,
})

out

在这里插入图片描述


29.如何交换两行数据

# Input
df = pd.DataFrame(np.arange(25).reshape(5, -1))

# Solution
def swap_rows(df, i1, i2):
    a, b = df.iloc[i1, :].copy(), df.iloc[i2, :].copy()
    df.iloc[i1, :], df.iloc[i2, :] = b, a
    return df

print(swap_rows(df, 1, 2))

在这里插入图片描述


30.如何将数据转置?

# Input
df = pd.DataFrame(np.arange(25).reshape(5, -1))
# Solution 1
df.iloc[::-1, :]
# Solution 2
print(df.loc[df.index[::-1], :])

在这里插入图片描述


31.如何创建分类变量(虚拟变量)的一次性编码?

# Input
df = pd.DataFrame(np.arange(25).reshape(5,-1), columns=list('abcde'))

# Solution
df_onehot = pd.concat([pd.get_dummies(df['a']), df[list('bcde')]], axis=1)
print(df_onehot)

在这里插入图片描述


32.如何将一个文本列分成两个独立的列?

# Input
df = pd.DataFrame(["STD, City    State",
"33, Kolkata    West Bengal",
"44, Chennai    Tamil Nadu",
"40, Hyderabad    Telengana",
"80, Bangalore    Karnataka"], columns=['row'])
print(df)
print('================================================')
# Solution
df_out = df.row.str.split(',|\t', expand=True)

# Make first row as header
new_header = df_out.iloc[0]
df_out = df_out[1:]
df_out.columns = new_header
print(df_out)

在这里插入图片描述

33.统计空值?

df.isnull().sum()

34.查看是否有重复值?

df.duplicated().any()

35.填充空值?
更多关于空值填充的可以看数据分析三剑客之pandas(八)

df.fillna(method = "ffill") #这是前向方法填充,bfill为后向填充
df.fillna(0) #用0填充空值

36.删除列?
更多相关内容同上

df.drop(["col"], axis =1, inplace = True)

37.删除有空值的行?

df.dropna(axis = 0, how = 'any', inplace = True)

38.删除重复值?

df.drop_duplicates(inplace=True)

39.修改数据类型?

df["col"] = df["col"].astype(int)

40.重置索引?

df = df.reset_index(drop = True)

41.按照某一列降序重新排序?

m = df['col'].sort_values(ascending = False).index[:].tolist()
df = df.loc[m]
df = df.reset_index(drop = True)

42.筛选出指标统计大于10的,以均值排序输出前十名?

s = s[s["count"]>20]
s.sort_values("mean", ascending = False).head(10)

43.分组统计输出为DataFram,并且进行列重命名?

df = df.groupby('',as_index = False).count[['','']]
df.rename(columns = {'原来的列名':'新的列名'},inplace = True)
#例如
df.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})

在这里插入图片描述


44.切片分段?(以分数列为例)

cut_bins = np.arrange(90,130,5)#分段设置,这里是分成5段
bins = pd.cut(df['score'], cut_bins)#将数据切片
bin_counts = df['score'].groupby(bins).count()

45.统计列值?

df['col'].value_counts()

46.查看相关性?

df.corr()

47.显示具体的唯一值

df['col'].unique()

48.显示列唯一值个数

df['col'].nunique()

49.返回列最大/小值的索引

df['col'].nlargest(这里指定几个)

df['col'].nsmallest(这里指定几个)

50.列的值进行截断

df['cpl'].clip(min,max)
 #这里将小于min的值变成min,max同理

51.列的值进行替换

df['col'].replace("旧的","新的")
df.replace('列':""旧的","新的")

52.计算列平均值

df['col'].mean()

53.将col列转换为list

df['col'].to_list()

54.按周为采样规则,取一周收盘价最大值

df['收盘价(元)'].resample('W').max()

55.将数据往后移动5天

df.shift(5) 
#将数据向前移动5天为-5

56.使用expending函数计算开盘价的移动窗口均值

data['开盘价(元)'].expanding(min_periods=1).mean()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐