Series是一列,一般情况下别用,尽量转到DataFrame.
pythonimport numpy as np
import pandas as pd
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
s = pd.Series([1, 3, 5, None, 6, 8])
print(s)
选取Series中的一个数据,[]里面的是Series的index,如果idnex不对下面这句话就会报错:
pythons[1]
pythons = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s.values)
print(s.to_dict())
Series转DataFrame:
pythons.to_frame()
DataFrame转Series,不用转,直接选取某一列就是Series,下面的df3就是Series:
pythondf3=df['A']
DataFrame
读取数据:
pythonimport numpy as np
import pandas as pd
df = pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo',
'G': [pd.Timestamp('2021-06-28 01:00:00'), pd.Timestamp('2021-06-28 02:00:00'),
pd.Timestamp('2021-06-28 03:00:00'), pd.Timestamp('2021-06-28 04:00:00'), ],
'H': [2, 30, 23, 12],
'I': ["123", "98", "23", "2"],
'X': [1, 2, None, np.nan]})
DataFrame广播性质
pythondf['G'] = 123 # 新增一列
df['A'] = 456 # 原来同名列被替代
print(df)
给某一列一个列表,列表长度要足够分配。
pythondf['A'] = [2,3,4,5]
查看所有列是什么对象:
pythondf.dtypes
得到所有的列名:
pythonlist(df.columns)
选择某些子列组成新的DataFrame,不用copy就容易引起警告,df=df[['B','C','A']]这样写注销掉之前的df也是可以无警告的:
pythondf2=df[['B','C','A']].copy()
更新所有的列名,长度需要相等,下面长度会报错:
pythondf2.columns=["TIME",'fl','vl']
根据列名删除某一列:
pythondf2.pop('C')
选取某一行某一列的某个数值,iloc重载了[]运算符,直接选第0行第1列:
pythondf.iloc[0,1]
iloc不便于给人看,最好是用loc:
pythondf.loc[0,'B']
此时赋值也是可以的:
pythondf.loc[0,'A']=10
loc还有更大的作用,下面2句话等价,都是选取满足条件的行:
pythondf.loc[df['E']=='test']
df.loc[df['E']=='test',:]
选取满足多个条件的那些行,注意区别&运算 和 | 运算 :
pythondf.loc[(df['E']=='test')&(df['A']==1)]
df.loc[(df['E']=='test')|(df['A']==1)]
当然,可以进一步选择,在满足条件的一行里面进一步选某一列或者多列:
pythondf.loc[df['E']=='test','A'] # 结果是一个series
多个条件取值:
pythondf.loc[(df['E']=='test')&(df['A']==1),'B'].values[0] # 条件筛选-->某一列-->第一个数值
遍历每一行,如果是要依靠for循环去修改每一行的数值,那最好用apply而不是这种方式:
pythonfor index, row in df.iterrows():
print(index) # 输出每行的索引值
重置index
pythondf.reset_index(drop=True) # drop=True 会丢弃之前的index
某一列的元素组成一个集合:
pythondf['A'].unique() # 某一列不重复的数值
将DataFrame变回python数据结构,我最常用参数是records,配合函数方便我往数据库写数据:
pythondf.to_dict(orient='records')
根据某一列的数值生成另一列:
pythondf['D']=df['G'].apply(lambda x:str(x)[0:10])
根据某两列的数值生成另一列,根据某几列的数值生成另一列同理:
pythondf['E']=df[['C','A']].apply(lambda x:x['A']+x['C'],axis=1)
df['D']此时是字符串,将字符串转换为日期:
pythondf['D']=pd.to_datetime(df['D'])
删除某一行,传入行index:
pythondf=df.drop(0)
删除数值满足条件的行
pythondf = df.drop(df[df['B']>2.6].index)
df = df.drop(df[df['B'].isin([np.nan])].index)
删除所有含有空值的行,any表示某一行有空值就会删除整行,all表示整行都是空值才删除整行:
pythondf.dropna(axis=0, how='any', inplace=True)
df=df.dropna(axis=0, how='any')
删除所有含有空值的列,any表示某一列有空值就会删除整列,all表示整列都是空值才删除整列:
pythondf.dropna(axis=1, how='any', inplace=True)
df=df.dropna(axis=1, how='any')
整张表都有哪些是空值,哪些不是:
pythondf.isnull()
判断表是不是存在空值,哪怕有一个空值都会返回True:
pythonnp.any(df.isnull())
判断表是不是每个元素都是空值:
pythonnp.all(df.isnull())
填充空值,如何填充空值:
将所有空值填充为0:
pythondf.fillna(0)
在列里面,从后面向前面填充,最后一行空值还是会是空:
pythondf.fillna(method=‘bfill’)
在列里面,从前面向后面填充,第一行空值还是会是空:
pythondf.fillna(method=‘ffill’)
横向填充,从前面向后面填充,第一列空值还是会是空:
pythondf.fillna(method=‘ffill’,axis=1)
处理空值的另一种方式,插值,线性插值,前向,竖着填充。
pythondf.interpolate(method=‘linear’, limit_direction=‘forward’, axis=0)
pandas 表里所有负数赋为空值,消除所有负数:
https://blog.csdn.net/x1131230123/article/details/117003108
关联性分析,相关性系数计算:
pythondata.corr() #相关系数矩阵,即给出了两个物品之间的相关系数
data.corr()[u'A物品'] #只显示A物品与其他菜式的相关系数
data[u'A物品'].corr(data[u'B物品']) #计算A物品与B物品的相关系数
print('series通过索引进行排序:'
print(series.sort_index())
print('series通过值进行排序:'
print(series.sort_values())
print('dataframe根据行索引进行降序排序(排序时默认升序,调节ascending参数)):'
print(frame.sort_index(ascending=False))
print('dataframe根据列索引进行排序:')
print(frame.sort_index(axis=1))
print('dataframe根据值进行排序:')
print(frame.sort_values(by='a'))
print('通过多个索引进行排序:')
print(frame.sort_values(by=['a','c']))
2列转换成字典关系:
pythonbind_adcode = city_df[['bind', 'adcode']].set_index('bind').to_dict()['adcode']
去重
df= df.drop_duplicates(subset="device_no", keep='first', inplace=False)
学习了基本操作后,进一步巩固就多看官网api:
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!