选择、修改数据(单层索引)
推荐使用.at、.iat、.loc、.iloc
操作 | 句法 | 结果 | 备注 |
---|
选择列 | df[col] | Series | 基于列名(列的标签),返回Series |
用标签选择行 | df.loc[label] | Series | 基于行名、列名(行、列的标签),默认为df.loc(axis=0)[label] |
用函数选择行 | df.loc[lambda,lambda] | Series | 基于行名、列名(行、列的数值),默认为df.loc(axix=0)[lambda] |
用整数位置选择行 | df.iloc[loc] | Series | 基于行、列的位置(行、列的数值索引) |
选择列 | df[[col]] | DataFrame | 基于列名(列的标签),返回DataFrame |
行切片 | df[5:10] | DataFrame | 基于行、列的位置(行、列的数值索引) |
用布尔向量选择行 | df[bool_vec] | DataFrame | |
混合方式 | df.xs(col, axis=1) | DataFrame | 基于行、列的标签(需指定axis=0或1) |
用列名选择列 | df.col | DataFrame | 基于列名(列的标签),同df[col] |
df['A']
df[0:3]
df['20130102':'20130104']
df.loc[dates[0]]
df.loc[:, ['A','B']]
df.loc['20130102':'20130104', ['A','B']]
df.loc[['A', 'B']] = df.loc[['A','B']]
df.iloc[0]
df.iloc[:, [0,2]]
df.iloc[0,[0,2]] = {'x':9,'y':99}
df.at['20130101','A'] 等同于 df.loc['20130101', 'A']
df.iat[0,0] 等同于 df.iloc[0,0]
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df.loc['A':'C']
df.iloc[:, 1000:1001]
df.iloc[:, 0:5]
df.iloc[:, [2]]
df.[lambda df: df.columns[0]]
df.loc(axis=1)[lambda x: x['col'].str.contains('keyword')]
df.loc[lambda x: x['col'].isin(that['col'].to_list())]
重置索引
当对df进行筛选后行索引会不连续,如需将索引转为连续索引,使用reset_index
df.reset_index()
df.reset_index(drop=True)
重建索引
s = pd.DataFrame(np.random.randn(5,3), index=['a', 'b', 'c', 'd', 'e'],columns=['one','two','three'])
s.reindex(index=['e', 'b', 'f', 'd'])
s.reindex(['e', 'b', 'f', 'd'], axis='index')
s.reindex(df.index)
s.reindex(columns=['three','two','one'])
s.reindex(['three','two','one'], axis='columns')
df1.reindex_like(df2)
方法 | 动作 |
---|
pad / ffill | 先前填充 |
bfill / backfill | 向后填充 |
nearest | 从最近的索引值填充 |
df1.reindex(df2.index, method='ffill')
df1.reindex(df2.index).fillna(method='ffill')
df1.reindex(df2.index, method='bfill')
df1.reindex(df2.index).fillna(method='bfill')
df1.reindex(df2.index, method='nearest')
df1.reindex(df2.index).fillna(method='nearest')
df1.reindex(df2.index, method='ffill', limit=1)
df1.reindex(df2.index, method='ffill', tolerance='1 day')
df.rename(index={'a':'apple', 'b':'banana'}, columns={'one': '1', 'two':'2'})
df.rename({'a':'apple', 'b':'banana'}, axis='index')
df.rename({'one': '1', 'two':'2'}, axis='columns')
布尔索引
df[df['A'] > 0]
df[df > 0]
df[df.index.isin(['2013-01-01', '2021-01-03'])]
布尔运算符进行多条件筛选
df[(df['A'] > 0 ) | (df['A'] < 1)]
df[(df['A'] > 0) & (df['A'] < 1)]
df[~df['A'] > 0]
s_mi = pd.Series(np.arange(6), index=pd.MultiIndex.from_product([0,1],['a','b','c']))
s_mi.iloc[s_mi.index.isin([(1,'a'),(2,'b')])]
s_mi.iloc[s_mi.index.isin(['a','b',,'c'], level=1)]
df.isin()
df =pd.DataFrame({'vals':[1,2,3,4],'ids':['a','b','f','n'],'ids2':['a','n','c','n']})
values ={'ids':['a','b'],'vals':[1,3]}
row_mask =df.isin(values).any(1)
row_mask =df.isin(values).all(1)
df.where(df>0, df['A'],axis='index',level=1)
df.mask(df>0,df['A'],axis='index',level=1)
使用query实现布尔运算
df.query('a < b & b < c')
df.query('color == "red"')
df.query('ilevel_0 =="red"')
df.query('`color type` == "red" ')
df.query(' a + b < c ')
df.query(' ( a > 0 & a < 5 ) | ( a < 0 & a > -5 )')
比较操作
支持的比较操作
缩写 | 作用 |
---|
eq | 等于 |
ne | 不等于 |
lt | 小于 |
gt | 大于 |
le | 小于等于 |
ge | 大于等于 |
df.gt(df2)
布尔简化
(df > 0).all()
pd.Series([True]).bool()
支持的布尔简化操作
缩写 | 作用 | 例子 |
---|
empty() | 判空 | s.empty() |
any() | 或运算 | s.any() |
all() | 且运算 | s.all() |
bool() | 验证单个元素的布尔值 | |
nan值比较
np.nan == np.nan
np.nan.equals(np.nan)
np.isna(np.nan)
equals()比较
df1 = pd.DataFrame({'col':['foo', 0, np.nan]})
df2 = pd.DataFrame({'col':[np.nan,0,'foo']}, index=[2,1,0])
df1.equals(df2)
df1.equals(df2.reset_index())