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([0, 1])
df.drop(index=[0, 1])
注意第一个参数为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.where
或np.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.where
和np.select
的解释可以参考[[#np where 和 np select 再解释]]
2.4.1. 问题
对于数值列,以亿为单位。如果数值较小(小于0.1亿),则转化成以万为单位,并加上万“万元”,否则,加上“亿元”。
如何使用np.select()直接操作?
暂时只想到一个非直达的方法: