索引
按行名索引 data.ix['row_name']
按行位置索引 data.iloc[2]
过滤指定列包含某些字符串 df_data['分类'].str.contains('婚|同居|抚养|赡养')
索引指定列data = data.loc[:, ['account', '首贷申请时间']]
分组并排序
In [84]: df = pd.DataFrame({'key1':['a','a','b','b','a'],
...: 'key2':['one','two','one','two','one'],
...: 'data1':np.random.randn(5),
...: 'data2':np.random.randn(5)})
In [85]: df
Out[85]:
data1 data2 key1 key2
0 1.579140 0.428876 a one
1 0.494486 0.397206 a two
2 -0.445459 -1.447018 b one
3 1.114477 -1.539330 b two
4 0.899226 -2.082411 a one
# 分组然后排序,多关键字排序,ascending的每个元素表示每个排序关键字的排序方式
In [86]: sort_func = lambda x: x.sort_values(['data1', 'data2'], ascending=[1, 0])
In [87]: dfgs = df.groupby(['key1', 'key2']).apply(sort_func)
In [88]: dfgs
Out[88]:
data1 data2 key1 key2
key1 key2
a one 4 0.899226 -2.082411 a one
0 1.579140 0.428876 a one
two 1 0.494486 0.397206 a two
b one 2 -0.445459 -1.447018 b one
two 3 1.114477 -1.539330 b two
# 分组排序后只取前n个值
In [89]: sort_func = lambda x: x.sort_values(['data1', 'data2'], ascending=[1, 0]).head(1)
In [90]: dfgsh = df.groupby(['key1', 'key2']).apply(sort_func)
In [91]: dfgsh
Out[91]:
data1 data2 key1 key2
key1 key2
a one 4 0.899226 -2.082411 a one
two 1 0.494486 0.397206 a two
b one 2 -0.445459 -1.447018 b one
two 3 1.114477 -1.539330 b two
数据读取
- 读取数据时设置格式
data = pd.read_excel(host_file, dtype={'emergency_contact_mobile(紧急联系人1)': str,
'emergency_contact_mobile2nd(紧急联系人2)': str,
'account': str})
- 读取数据时指定列名
data = pd.read_excel(data_file, header=None, names=['sentence']) # 本来没有表头,想要指定表头
修改column名
data.rename(columns={'emergency_contact_mobile(紧急联系人1)': 'emergency1',
'emergency_contact_mobile2nd(紧急联系人2)': 'emergency2',
'首贷申请时间': 'first_time'},
inplace=True)
dataframe转换为dict
data = data.to_dict('records')
参考:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html
去除nan, inf等
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
df_data = df_data[df_data['问题'].notnull()]
df_data.fillna('', inplace=True)
data.replace([np.nan, np.inf, -np.inf], 0.0, inplace=True)
data.dropna(inplace=True)
根据条件修改值
- 某些列满足特定条件,然后改变另外的某些列的值
data.loc[data['label']=='中立', 'label'] = 2
- 对某一列做处理
data['sentence'] = data['sentence'].map(lambda x: text_processor.clean_data(x))
- 根据某一列来新增一列
data['sent_len'] = data.apply(lambda x: len(x.sent.split()), axis=1)
删除/选取含有特定数值的行或列
- 删除某列中包含某些值的行
In [93]: data = pd.DataFrame({'a': [1,2,3], 'b': ['x', 'y', 'z']})
In [94]: data
Out[94]:
a b
0 1 x
1 2 y
2 3 z
In [95]: data[~data['a'].isin([1, 4, 5])]
Out[95]:
a b
1 2 y
2 3 z
按索引合并多个dataframe
# join函数默认将两个DataFrame的index进行合并
In [75]: data = pd.DataFrame({'id': [1, 2, 3 ], 'sent': ['天气真好', '太糟糕了', '你真漂亮']}).set_index('id')
In [76]: label = pd.DataFrame({'id': [1, 2, 3, 4], 'label': [1, 0, 1, 0]}).set_index('id')
In [77]: data.join(label)
Out[77]:
sent label
id
1 天气真好 1
2 太糟糕了 0
3 你真漂亮 1
一些实例
1. 一个读取文件的例子
def parse_application_file(application_file):
data = pd.read_table(application_file, sep='\t', encoding='utf-8', engine='python', dtype = {'account' : str}) # 读取txt文件,以'\t'为分割,'account'列的格式转换成str
data = data.loc[:, ['account', 'addtime']]
data.rename(columns={'addtime': 'first_time'}, inplace=True) # 修改列名
data = data.set_index('account') # 把account列作为索引
print(data)
return data
# index和column的转化,参考https://www.cnblogs.com/hhh5460/p/7067928.html
2. 例子2
padndas主要有两个数据结构:Series和DataFrame,Series是一维的,DataFrame是多维的
a b c
0 -0.736197 -0.335370 0.481670
1 0.711621 -0.058633 0.900464
2 0.155500 -1.276001 0.258305
3 -0.534122 -1.037665 0.896956
4 1.219956 -0.118095 1.198172
5 1.072023 0.063791 1.256559
6 -0.473086 -0.178254 0.156161
7 -1.513761 -0.108119 0.009331
8 -1.422717 0.893938 0.682988
9 -0.846942 -1.049053 -1.865867
a b c d
0 -0.564985 -1.759755 -0.685495 2.401377
1 0.982828 -0.466383 -0.294046 -0.127314
2 -0.647312 -0.325171 1.343659 0.531490
3 1.961272 -0.657042 0.180206 1.141887
4 -1.727753 -0.851462 0.993567 -0.050135
5 0.589302 1.062840 -1.079232 -1.139247
6 1.316333 1.092938 -0.094878 0.062580
7 1.167384 1.141346 -1.680329 -1.352795
8 -0.315625 1.065582 -0.416427 -0.319961
9 0.543425 -1.087297 1.179758 0.139975
# 随机为学生分配一位导师
import pandas as pd
import numpy as np
df_s = pd.read_excel('2016信息新生名单原始空表.xls')
df_t = pd.read_excel('教师名单.xlsx')
s=df_s[df_s.院系=='信息科学技术学院'].sort('姓名') # 只选取信息科技学院的学生,并按姓名排序
# s=df_s.query('院系==["信息科学技术学院"]')
t=df_t.values[:,1]
s['导师'] = pd.Series(np.random.choice(t,size=181), index=s.index)