pandas笔记

本文详细介绍了Pandas库的基础知识,包括Series的创建、提取元素,DataFrame的选择定位、删除操作,以及数据清洗、统计分析等。重点讲解了如何使用loc和iloc方法、设置索引和列名,还有数据的聚合、分段处理和数据连接。此外,还探讨了时间日期处理和数据类型转换等关键概念。
摘要由CSDN通过智能技术生成

1. Series基础

1.1. 创建Series

  • 从字典创建
prices = {
   'apple':4.99,
  'banana':1.99,
  'orange':3.99,
  'grapes':0.99}
ser = pd.Series(prices)
  • 从标量创建
ser = pd.Series(2,index = range(0,5))

1.1.1. 使用字母索引

ser = pd.Series(range(1,15,3),index=[x for x in 'abcde'])

1.1.2. 随机数序列

import random
ser = pd.Series(random.sample(range(100),6))

1.1.3. 对Series进行命名

import pandas as pd
a =[1,3,5,7]
a = pd.Series(a,name ='JOE')
a = pd.DataFrame(a)

1.2. 提取元素

1.2.1. 使用比较

import pandas as pd
import random

x = random.sample(range(100),10)
print(x)
y = pd.Series(x)
print(y)
print("==============================")
print(y[y>40])

1.2.2. 使用列表索引

x=random.sample(range(100),10)
print(x)
y = pd.Series(x)
print(y[[2,0,1,2]])

1.2.3. 使用函数

def joe(x):
    return x +10
x = random.sample(range(100),10)
print('Data => ',x,'\n')
y = pd.Series(x)
print('Applying pow => \n' ,pow(y,2),'\n')
print('Applying joe => \n',joe(y))

1.2.4. 元素检查

x = pd.Series(range(1,8),index=[x for x in 'abcdefg'])
print(x,'\n')
print('Is "j" in x? ','j' in x)
print('Is "d" in x? ''d' in x)

2. DataFrame基础

2.1. 选择定位

  • loc方法:通过行索引 "index" 中的具体值来取行数据(如取"Index"为"A"的行)
  • iloc方法:通过行号来取行数据(如取第二行的数据)
    • 选取某几列: df.iloc[:,[0,3,5,1]]
  • 利用loc函数的时候,当index相同时,会将相同的Index全部提取出来,优点是:如果index是人名,数据框为所有人的数据,那么我可以将某个人的多条数据提取出来分析;缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理,可用.reset_index()函数重置index
    • 注意,此处设置索引时,直接 .set_index('XXX')不行,必须这样: df = df.set_index('XXX')才能生效。
    • 或者,可以这样: .set_index('XXX', inplace = True])
  • 使用点符号。
    • data.Area.head()
  • 如果选取的结果是dataframe,则列或行要表示成列表形式。
    • data[['column_name_1', 'column_name_2']]

2.1.1. 获取DataFrame中分组最大值的索引

  • idxmax()可以获取原df中最大值的索引
  • contb.groupby('cand_nm',as_index=False)[['contb_receipt_amt']].max().index()获取的是生成的新df的索引(即从0开始)
  • contb.groupby('cand_nm')[['contb_receipt_amt']].max().index()获取df是以 cand_nm为索引

综上,想要获取每个候选人获取单笔献金最大值的索引,只能用idxmax()方法。

但是这种方法有个缺陷,即只能找出其中一个最大捐赠者。如果一个候选人有多个相同额度的最大捐赠者,则这种方法行不通。

下面的方法,用groupby找出每个候选人最大的捐赠额,然后用候选人和捐赠额作为条件,找出相对应的行。

df_max_donation = pd.DataFrame()
s = contb.groupby('cand_nm')['contb_receipt_amt'].max()
for i in range(s.size):
    ex = 'cand_nm == "%s" & contb_receipt_amt == %f' % (s.index[i], s.values[i])
    # print(ex)
    df_max_donation = pd.concat([df_max_donation,contb.query(ex)],axis=0,)
display(df_max_donation)

应该还有一种方法,将s(Series)转成dataframe,然后和contb进行join操作。 参见[[美国大选献金分析#^805156]]

2.2. 删除列

dt=data.drop("Area",axis=1,inplace=True)
  • axis=1,此操作影响列,即导致列的增加或减少
  • inplace=True,直接在原始 DataFrame 上编辑
  • 有关axis的用法可以参考[[#axis 的理解]]

2.3. 删除行

df.drop([01])
df.drop(index=[01])

注意第一个参数为index,所以在以条件删除行的时候要确认获得条件筛选之后的index值作为参数。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A''B''C''D'])
# df.drop(df[df['A']==4].index,inplace=True)
df.drop(df[df['A']==4].index,inplace=True)

2.4. 增加列或修改列

data.loc[data['id'] > 800"first_name"] = "John"

这段代码可以增加first_name列,如果first_name列已经存在,则会修改满足条件的行的该列值。 增加列也可以用np.wherenp.select

另外,np.select也可以用来修改已经存在的某列的指定行的值,这种情况下,np.select修改的是整列的值,所以如果只想修改特定条件行的值,要注意修改default的值。

con = [abb_pop['state/region'] == 'PR', abb_pop['state/region'] == 'USA']
values = ['Puerto Rico''United States of America']

abb_pop['state'] = np.select(con, values, default=abb_pop['state'])

有关np.wherenp.select的解释可以参考[[#np where 和 np select 再解释]]

2.4.1. 问题

对于数值列,以亿为单位。如果数值较小(小于0.1亿),则转化成以万为单位,并加上万“万元”,否则,加上“亿元”。

如何使用np.select()直接操作?

暂时只想到一个非直达的方法:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值