pandas使用指南

127 阅读9分钟

Pandas

太大的csv文件最好不要用wps打开,保存的时候有些数据会保存成#NAME?

# Pandas.DataFrame

数据按照行字段过滤

article_df = article_df[article_df['vv'] > vv_threshold] 

使用apply方法新建一行,并过滤

article_df['is_filter'] = article_df['content'].apply(lambda x: str(x).startswith('{"rich_content"'))

article_df = article_df[article_df['is_filter'] == False]

按照某个字段的列表长度进行过滤

df[df.c.map(len)>1]

df.loc[np.array(list(map(len,df.c.values)))>1]

df[df.c.apply(lambda x: len(x) > 1)]

过滤,多个条件可以使用条件语句

df_slice = df.loc[(df['A'] == 4) & (df['C'] == 6)]

range_pdf = in_pdf[(in_pdf['date'] >= left) & (in_pdf['date'] <= right)]

过滤(query)

newdf = df.query('产品 == "纺织" & 产量 > 50')

使用np创建一个pd

data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))

df = pd.DataFrame(np.arange(16).reshape(4, 4), index=pd.date_range('20200101', periods=4) ,   columns=list('ABCD')

df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

使用字典创建一个pd,要求字典的键是header

df = pd.DataFrame.from_dict(data_dict)

使用数组创建一个pd,要求数组中的元素是数组,为每一行的数据

data_list = [[1, 25, ’男’], …]

headers = [‘id‘, ’年龄‘, ’性别‘]

df = pd.DateFrame(data_list, columns=headers)

移动pd中header的位置

new_header中是新的header的位置

new_pd = all_union_pdf[new_header]

对pd按照score字段排序,并按照user, subject两个字短group

df.sort_values(by='score').groupby(['user', 'subject'])

sort_values不原地改变,返回排序号的对象

sort_values方法参数:

by : str or list of str(字符或者字符列表)

ascending : bool or list of bool, default True(是否升序排序,默认升序为True,降序则为False。如果是列表,则需和by指定的列表数量相同,指明每一列的排序方式)

na_position : {‘first’,‘last’}, default ‘last'.(如果指定排序的列中有nan值,可指定nan值放在第一个还是最后一个)

article_df_group['uv'].sum()

pandas to_dict

pd.to_dict(orient=‘dict’)  # {column -> {index -> value}}

pd.to_dict(orient=‘index’)  # {index -> {column -> value}}

pd.to_dict(orient=‘list’)  # {column -> [values]}

pd.to_dict(orient=‘series’)  # {column -> Series(values)}

pd.to_dict(orient=‘split’)  # {index -> [index], columns -> [columns], data -> [values]}

pd.to_dict(orient=‘records’)  # [{column1 -> value, column2 -> value, …}, … , {column1 -> value, ….}]

新建索引,并把老索引拿出来并生成一个新的列

reset_index后老索引默认生成的列名为’index’

df = df.reset_index().rename(columns={"index":"new"})

新建索引不保留之前的索引

df = df.reset_index(drop=True)

新建索引,之前的搜索默认

对pd按照字段编号

df['C'] = df.groupby(['A','B']).cumcount()+1

pd 插入一列

df在左边添加一列索引

df.insert(0, 'index', range(len(df)), allow_duplicates=False)  # 0表示放在第0列,range(len(df))为数据,allow_duplicates=False不允许列名重复

df在最后插入一列

df = df.insert(data.shape[1], 'd', 0)

直接赋值

df = df[‘d’] = 0

reindex

data = data.reindex(columns=['a', 'b', 'c', 'd'], fill_value=0) # 要把之前需要保留的列都写上

concat

 data = pd.concat([data, pd.DataFrame(columns=['d'])], sort=False)

loc

data = data.loc[:, 'd'] = 0

读取或者选择几列

df = pd.DataFrame(df, columns=[‘a’, ‘b’])

df[[‘a’, ‘b’]]

df.loc[:, [‘b’, ‘c’]]

df.iloc[:, 2:]

pd.read_csv(‘文件.csv’, usecols=[‘a’, ‘b’, ‘c’])

# 排序

pd.sort_values(by=[‘a’, ‘b’], inplace=False, ascending=True) # inplace 是否原地排序

查看df的数据

df.head(2)

# groupby

as_index, 不让groupby的label变为index

oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)

# 删除重复列

下面两个写法一样

article_df_all = article_df_all.drop_duplicates('topic_id')

article_df = article_df_all.drop_duplicates(subset = [ 'cluster_id' ] )

# 根据所有列删除重复行

df.drop_duplicates()

保留最后一行(last),第一行(first)

df.drop_duplicates(subset=['brand', 'style'], keep='last')

重复的全部去掉

f=df.drop_duplicates(keep=False)

# drop

DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)

默认参数 axis=0,表示对行进行操作,如需对列进行操作需要更改默认参数为 axis=1,

默认参数 inplace=False,表示该删除操作不改变原数据,而是返回一个执行删除操作后的新 dataframe,如需直接在原数据上进行删除操作,需要更改默认参数为 inplace=True

labels就是要删除的行列的名字,用列表给定
axis默认为 0,指删除行,因此删除 columns 时要指定 axis=1;
index直接指定要删除的行
columns直接指定要删除的列

# concat连接

df_concat = pd.concat([title_word_df, content_word_df], axis=1) 

applymap

applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作

获取列名的列表

df.columns

多重聚合

 df.groupby('A').agg(['min', 'max'])

'''

B             C

min max       min       max

A

1   1   2  0.227877  0.362838

2   3   4 -0.562860  1.267767

'''

**

# as_index

oldest_staff = data.groupby('company',as_index=False)  # company字段不会被当作索引

iloc的使用

df.iloc[-1, :]  # 返回df的最后一条数据

transform的使用

添加新的一行,值根据group的结果计算

data['avg_salary'] = data.groupby('company')['salary'].transform('mean')

相当于

avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()  # 求平均

data['avg_salary'] = data['company'].map(avg_salary_dict)  # 映射

pd.isna()

判断pd中某个值是否存在,如果不存在返回True

pd.isnull()

pd.isnull()可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测

首先创建一个DataFrame:

df = pd.DataFrame({'a':[0,1,2,np.nan]})

df

    a

    0 0.0

    1 1.0

    2 2.0

    3 NaN

测试isnull()

pd.isnull(df)

    a

    0 False

    1 False

    2 False

    3 True

测试isna()

pd.isna(df)

    a

    0 False

    1 False

    2 False

    3 True

groupby之后每一行是一个pd.DataFrame

pd.DataFrame[‘header’].tolist()可以对其中的某一列数据进行处理

拿到某个字段的字符串,并且字符串中要包含…

.str.contains(‘&’)

self._common_pdf = conf_pdf[(conf_pdf['version'].str.contains('&')) &

                            (conf_pdf['version'] != version)]

# groupby操作

df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])

num_agg = {'Age':['min', 'mean', 'max'], 'Income':['min', 'max']}

print(df.groupby('Country').agg(num_agg))

df.groupby(['key1'])['data1'].min()

df.groupby(['key1'])['data1'].agg({'min'})

df.groupby(['key1']).agg({'data1':'min'})  #对data1列,取各组的最小值,名字还是data1

df.groupby(['key1'])['data1'].agg({'min','max'})  # 按key1分组后,aggregate各组data1的最小值和最大值

df.groupby(['key1']).agg({'data1':['min','max']})

groupby之后直接.reset_index()可以得到一个没有多级索引的DataFrame

统计各个分组的行数

df = df.groupby('date').size() # 统计各个分组行数

或者这样统计

df.groupby(['key1']).agg({'data1':['min','max’, ‘size’]})

size: 行数,mean:平均,median:中位数,min,max

grouby之后求行数

size和count的区别

import pandas as pd

a = {'name':['jack', 'rose', 'jack'], 'age': [21, 23, 24], 'nation': ['us', 'uk', 'us']}

test_pdf = pd.DataFrame.from_dict(a)

test_pdf

   name  age nation

0  jack   21     us

1  rose   23     uk

2  jack   24     us

test_pdf.groupby('nation').size().reset_index()

  nation  0

0     uk  1

1     us  2

test_pdf.groupby('nation').count().reset_index()

  nation  name  age

0     uk     1    1

1     us     2    2

重命名

df.rename({‘old_col1':‘new_col1',‘old_col2':‘new_col2',…})重命名

groupby

df['data1'].groupby([df['key1'],df['key2']]).mean()

等价于:df.groupby(['key1','key2'])['data1'].mean()

pd.Dataframe操作

获取中位数

pdf.quantile()

获取某一分位值

pdf.quantile(0.995)
min # 最小值

max # 最大值

mean # 平均值

median # 中位数

std # 标准差

sum # 总数

# 查看前十条数据

df.head(10)

# 取某一列中不重复的值

df.column_name.unique()

# pd.core.frame.DataFrame

df_res = pd.core.frame.DataFrame(

    {"content": list_content, "label": list_label, "pred": list_pred})

# 通过字符串中是否包含某个内容进行过滤

df[df["description"].str.contains("used car")]

df_train = df_train[(df_train['origin'].str.contains('ad') == False) & (df_train['origin'].str.contains('广告') == False)]

字符串过滤

按长度

df[df["description"].str.len() > 15]

df[df["description"].apply(lambda x: len(x) > 15)]

按起始字符

df[df["lot"].str.startswith("A")]

是否能转字符

df[df["price"].apply(lambda x: x.isnumeric()==True)]

字符出现次数

df[df["description"].str.count("used") < 1]

字符串出现在列表中

pdf = pdf[pdf['origin'].isin(

    ['toutiao_test', 'ad_test', 'douyin_test', 'search_test'])]

# sample采样

df.sample(frac=1)

这样对可以对df进行shuffle。其中参数frac是要返回的比例,比如df中有10行数据,我只想返回其中的30%,那么frac=0.3。

有时候,我们可能需要打混后数据集的index(索引)还是按照正常的排序。我们只需要这样操作

df.sample(frac=1).reset_index(drop=True)

# shuffle

from sklearn.utils import shuffle

df = shuffle(df)

 另外,numpy库中也有进行shuffle的方法(不建议)

df.iloc[np.random.permutation(len(df))]

# 多列生成新列

data["x1"]**=data[["a","b"]] . apply(lambda x:x["a"] + x["b"],axis=**1)

关键的参数是axis=1,指定计算的方向是行而不是列,默认是0,也就是按列进行计算

# fillna

    pdf = pd.read_csv(csv_file).fillna(

        value={

            'yuntu': '', 'entity': '', 

            'entity_accuracy': 0, 'brand_accuracy': 0

        }

    )

pdf = pdf[pdf['origin'].isin(

    ['toutiao_test', 'ad_test', 'douyin_test', 'search_test'])]

# 返回多行

方法一:使用apply 的参数result_type 来处理

def formatrow(row):

    a = row["a"] + str(row["cnt"])

    b = str(row["cnt"]) + row["a"]

    return a, b 

 

df_tmp[["fomat1", "format2"]] = df_tmp.apply(formatrow, axis=1, result_type="expand")

df_tmp

a cnt fomat1 format2

data1 100 data1100 100data1

data2 200 data2200 200data2

————————————————

版权声明:本文为CSDN博主「赵孝正」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/weixin_4671…

# merge 合并两个表格

df_1.merge(df_2,how='left',on='userid')

how: inner/left/right/outer

# dropna去掉有nan的行

pdf = pdf.dropna(subset=['origin_content'])

zhuanlan.zhihu.com/p/113972190

# isna

import pandas as pd

import numpy as np

pd.isna(1)

False

a = pd.DataFrame.from_dict({'key':['a'], 'value': [1]})

b = pd.DataFrame.from_dict({'key':['b'], 'value': [1]})

c = a.merge(b, on=['key'], how='outer')

c

  key  value_x  value_y

0   a      1.0      NaN

1   b      NaN      1.0

for row in c.iterrows():

...     v = row[1]['value_x']

...     print(pd.isna(v))

... 

False

True

pd.isna(np.nan)

True

# 生成多个行

explode

explode这个爆炸方法只能处理列表、元组、Series和numpy的ndarray的类型

explode生成的列是没有顺序的,多次执行会不一样

对于字符串的格式

df[‘key’] = df[‘key’].str.split()先把key列变成表格 

# astype可以用来转换某一行的类型

以下是一些使用示例:

df.index.astype('int64') # 索引类型转换

df.astype('int32') # 所有数据转换为int32

df.astype({'col1':'int32'}) # 指定字段转指定类型

s.astype('int64')

s.astype('int64',copy = False) # 不与原数据关联

df['name'].astype('object')

data['Q4'].astype('float')

s.astype('datatime64[ns]') # 转为时间类型

data['状态'].astype('bool')

————————————————

版权声明:本文为CSDN博主「山茶花开时。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/Hudas/artic…

blog.csdn.net/Hudas/artic…

pd.Datafrme()可以直接append()连接另一个pdf,默认是把列连接在一起

根据字段'material'进行分组,对字段'site'进行合并,内容之间用逗号(,)分隔,再进行去重处理;对字段'LT'取最大值,最终呈现结果如下所示

import pandas as pd

 

df = pd.DataFrame([['FJZ','A123',123],

                   ['FOC','A123',456],

                   ['FJZ','B456',112],

                   ['FJZ','B456',245],

                   ['FJZ','B456',110],

                   ['FOC','C789',202],

                   ['FOC','C789',205]

                  ],columns=['site','material','LT'])

 

筛选字段'material'并进行去重处理

merge_data = df[['material']]

merge_data = merge_data.drop_duplicates(subset = ['material'])

 

对'site'和'LT'字段进行处理

df = df.groupby(['material']).agg({'site':[','.join],'LT':max})

更换字段栏位名称

new_column = ['site','LT']

df.columns = new_column

 

对字段'site'中的值进行去重处理

def data_deduplication(row):

    data_list = row['site'].split(',')

    res = ','.join(set(data_list))

    return res

 

df['site'] = df.apply(lambda row:data_deduplication(row), axis=1)

 

merge_data = pd.merge(merge_data, df, how='left', on=['material'])

调整字段顺序

order = ['site','material','LT']

————————————————

版权声明:本文为CSDN博主「山茶花开时。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/Hudas/artic…

# to_csv quoting参数

有些字符串中含有\r字符,如果不加quoting=1,\r会导致换行,从而引起数据错位

  • quoting : int, Controls whether quotes should be recognized. Values are taken from csv.QUOTE_* values. Acceptable values are 0, 1, 2, and 3 for QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONE, and QUOTE_NONNUMERIC,
    respectively.

stackoverflow.com/questions/2…

pd.read_csv会对有null的列进行自动转换,整型会变为浮点数,null变为nan

添加keep_default_na=False,阻止自动类型转换

# Pandas.Series

Creating the Series 

sr = pd.Series(['New York', 'Chicago', 'Toronto', 'Lisbon', 'Rio', 'Moscow']) 

Create the Datetime Index 

didx = pd.DatetimeIndex(start ='2014-08-01 10:00', freq ='W',  periods = 6, tz = 'Europe/Berlin')  

set the index 

sr.index = didx 

Print the series 

print(sr)

ERROR:

数据写入一个字符串\r\r\rla challpe的时候,\r会起到换行的作用,从而导致多出来三行