https://ericfu.me/10-minutes-to-pandas/
DataFrame 是由 Series 组成的,内部使用numpy格式存储
用 head 和 tail 查看顶端和底端的几列
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' })
输出:
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
df.head()
df.tail(3)
df.columns
df.values
describe() 显示数据的概要。
转置:df.T
对 axis 按照 index 排序(axis=1 是指第二个维度,即:列)
按值排序 df.sort_values(by=’B’)
选择
注意,以下这些对交互式环境很友好,但是作为 production code 请用优化过的 .at, .iat, .loc, .iloc 和 .ix
获取行/列
从 DataFrame 选择一个列,就得到了 Series
df[‘A’]
df[0:3]
loc是通过标签来选择数据
df.loc[‘one’]则会默认表示选取行为’one’的行;
df.loc[:,[‘a’,’b’] ] 表示选取所有的行以及columns为a,b的列;
df.loc[[‘one’,’two’],[‘a’,’b’]] 表示选取’one’和’two’这两行以及columns为a,b的列;
df.loc[‘one’,’a’]与a.loc[[‘one’],[‘a’]]作用是一样的,不过前者只显示对应的值,而后者会显示对应的行和列标签。
通过整数下标选择
这个就和数组类似啦,直接看例子。选出第3行:
df.iloc[3]
选出3~4行,0~1列:
df.iloc[3:5,0:2]
也能用 list 选择
df.iloc[[1,2,4],[0,2]]
也能用 slice
df.iloc[1:3,:]
对应单个元素
df.iloc[1,1]
df.iat[1,1]
布尔值下标
和 MATLAB 类似
基本用法
df[df.A > 0]
没有填充的值等于 NaN
df[df > 0]
isin() 函数:是否在集合中
df2 = df.copy()
df2[‘E’] = [‘one’, ‘one’,’two’,’three’,’four’,’three’]
df2[df2[‘E’].isin([‘two’,’four’])]
Setting
为 DataFrame 增加新的列,按 index 对应
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range(‘20130102’, periods=6))
df[‘F’] = s1
通过 label 设置
df.at[dates[0],’A’] = 0
通过下标设置
df.iat[0,1] = 0
缺失值
pandas 用 np.nan 表示缺失值。通常它不会被计算。
Reindexing 允许你改变某个轴的 index(以下代码制造一个示例用的 DataFrame)
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + [‘E’])
df1.loc[dates[0]:dates[1],’E’] = 1
丢弃有 NaN 的行
df1.dropna()
填充缺失值
df1.fillna(value=5)
获取布尔值的 mask:哪些值是 NaN
pd.isnull(df1)
对于 DataFrame,可以直接 plot
df.plot();
plt.legend(loc=’best’)
plt.show()
读取、写入数据
pd.read_csv(‘foo.csv’)
df.to_csv(‘foo.csv’)
Excel
pd.read_excel(‘foo.xlsx’, ‘Sheet1’, index_col=None, na_values=[‘NA’])
df.to_excel(‘foo.xlsx’, sheet_name=’Sheet1’)
分组、过滤
df.groupby(‘B’).filter(lambda x: len(x) > 2, dropna=False)
append
grouped = df.groupby(['key1']) print("grouped.size:", grouped.size()) print("END-----------------------------") NewDataFrame = pd.DataFrame() for x, y in grouped: # print(name) print(y) NewDataFrame=NewDataFrame.append(y) print(NewDataFrame)