Pandas使用总结

索引

按行名索引 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

数据读取

  1. 读取数据时设置格式
data = pd.read_excel(host_file, dtype={'emergency_contact_mobile(紧急联系人1)': str,
                                       'emergency_contact_mobile2nd(紧急联系人2)': str,
                                       'account': str})
  1. 读取数据时指定列名
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)

根据条件修改值

  1. 某些列满足特定条件,然后改变另外的某些列的值
data.loc[data['label']=='中立', 'label'] = 2
  1. 对某一列做处理
data['sentence'] = data['sentence'].map(lambda x: text_processor.clean_data(x))
  1. 根据某一列来新增一列
data['sent_len'] = data.apply(lambda x: len(x.sent.split()), axis=1)

删除/选取含有特定数值的行或列

  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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容