pandas的简单使用(增加)
增加行
# 增加一行 索引是BBC,值全是12
df.loc['BBC'] = 12
# 也可以这么写
df.loc['BBC',:] = 12
explod() 函数
import pandas as pd
df = pd.DataFrame({
"Name": ["吕布", "貂蝉", "赵云"],
"Hobby": [
['打篮球', '玩游戏', '喝奶茶'],
['看电影', '喝奶茶'],
['打篮球', '听音乐', '喝奶茶', '健身'],
]
})
print(df)
print(df.explode('Hobby').reset_index(drop=True))
'''
Name Hobby
0 吕布 [打篮球, 玩游戏, 喝奶茶]
1 貂蝉 [看电影, 喝奶茶]
2 赵云 [打篮球, 听音乐, 喝奶茶, 健身]
Name Hobby
0 吕布 打篮球
1 吕布 玩游戏
2 吕布 喝奶茶
3 貂蝉 看电影
4 貂蝉 喝奶茶
5 赵云 打篮球
6 赵云 听音乐
7 赵云 喝奶茶
8 赵云 健身
'''
增加列
添加一列
# 增加一个时间列,值全为0
df['时间'] = 0
# 也可以这么写
df.loc['时间',:] = 0
# 增加一个名为 temp 的列,值全为下划线
df['temp'] = '_'
# 增加一个温差列,等于最高温减最低位(默认加到最后一列)
df['温差'] = df['最高温'] - df['最低温']
# 等价于
df.loc[:, '温差'] = df['最高温'] - df['最低温']
# 或者
def add_col(x):
new_col = x['最高温']+x['最低温']
return new_col
df['温差'] = df.apply(add_col, axis=1)
添加多列
# 同时添加温差,平均温度 两列
def my_func(row):
return row["最高温"]-row["最高温"], (row["最高温"]+row["最低温"])/2
df[["温差", "平均温度"]] = df.apply(my_func, axis=1, result_type="expand")
# 将日期和时间拆开(2021-10-01 12:33:14)
def func(x):
a = str(x['日期']).split(' ')
return a[0], a[1]
df[['day','time']] = df.apply(func, axis=1, result_type="expand")
条件添加
带逻辑判断的
新增一个温度类型列,类型由温度值决定
df['类型'] = ''
df.loc[df['最高温']>33, '类型'] = '高温'
df.loc[df['最低位']<-10, '类型'] = '低温'
df.loc[(df['最高温']<=33) & (df['最低位']>=-10), '类型'] = '常温'
# 等价于
def get_wendu_type(x):
if x["最高温"] > 33:
return '高温'
if x["最低位"] < -10:
return '低温'
return '常温'
df.loc[:, "类型"] = df.apply(get_wendu_type, axis=1) # 注意需要设置axis=1,这是series的index是columns
新增一个C列。如果A列>B列,C列得到A列的值;如果列B>A列,列C获取列B的值
import pandas as pd
import numpy as np
data = pd.DataFrame({'A':[0.5,1.1,0.1,2.0],'B':[1.2,0.7,0.3,0.9]})
# 方法一
data['C1'] = np.where(data['A']>data['B'], data['A'], data['B'])
# 方法二 (注意中括号少了会报错)
data['C2'] = data[['A','B']].max(axis=1)
# 方法三
def Asd(a,b):
if a>=b:
return a
else:
return b
data['C3'] = data.apply(lambda x:Asd(x.A, x.B),axis=1)
带运算的
新增一个总分列。总分等于语数英三科相加。
(这个操作相当于在Excel中,先在一个单元格输入=C2+D2+E2,然后自动填充。)
import pandas as pd
data = pd.read_table('F:\Temp\jieguo123.csv',sep=';')
# 方法一
data['总分1'] = data['语文'] + data['数学'] + data['英语']
# 方法二
def get_row_sum(x):
return x['语文']+x['数学']+x['英语']
data.loc[:,'总分2'] = data.apply(get_row_sum, axis=1)
# 方法三
def getSum(x,y,z):
return x + y + z
data['总分3'] = data.apply(lambda x:getSum(x.语文, x.数学, x.英语), axis=1)
新增一个编码列。编码由 身高的数值加下划线加体重的数值,组成。例如身高177,体重65,编码就是177_65。
(这个操作相当于在Excel中,先在一个单元格输入=C2&“_”&D2,然后自动填充。)
import numpy as np
import pandas as pd
data = pd.read_table('F:\Temp\jieguo123.csv',sep=';')
# 方法一(如果某一列是非str类型的数据,需要转换)
data['temp'] = '_'
data['编码'] = data['身高'].astype(np.str) +data['temp'].astype(np.str) +data['体重'].astype(np.str)
# 方法二
data['编码'] = data['身高'].astype(np.str) + '_' +data['体重'].astype(np.str)
# 方法三(如果某一列是非str类型的数据,需要用到 map(str)将那一列数据类型做转换)
data['编码'] = data['身高'].map(str) + '_' +data['体重'].map(str)
如果代码这样写 data[‘编码’] = data[‘身高’] + “-” +data[‘体重’] 会报错
如果是这样 data[‘编码’] = data[‘身高’] + data[‘体重’] 结果就是两个数值直接相加了
函数map、apply、applymap
- map:只用于Series,实现每个值->值的映射;
- apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理
- Series.apply(function), 函数的参数是每个值
- DataFrame.apply(function), 函数的参数是Series
- applymap:只能用于DataFrame,用于处理该DataFrame的每个元素
新增一个中文名称列,将公司的英文对应为它的中文名
代码 df[“公司”].unique() 可查看公司名,运行结果是 array([‘BIDU’, ‘BABA’, ‘IQ’, ‘JD’], dtype=object)
# 注意这里是小写
dict_company_names = {
"bidu": "百度",
"baba": "阿里巴巴",
"iq": "爱奇艺",
"jd": "京东"
}
# 方法1:Series.map(dict)
df["公司中文1"] = df["公司"].str.lower().map(dict_company_names)
# 方法2:Series.map(function) function的参数是Series的每个元素的值
df["公司中文2"] = df["公司"].map(lambda x : dict_company_names[x.lower()])
# 方法3: Series.apply(function) function的参数是Series的每个值
df["公司中文3"] = df["公司"].apply(lambda x : dict_company_names[x.lower()])
# 方法4: DataFrame.apply(function) function的参数是对应轴的Series
df["公司中文4"] = df.apply(lambda x : dict_company_names[x["公司"].lower()], axis=1)
新增一个身高列,将单位米转成厘米
df['身高(cm)'] = df.applymap(lambda x : int(x*100))
# 如果是修改
df.loc[:, ['身高']] = df.applymap(lambda x : int(x*100))
# 修改多个
df.loc[:, ['分数', '时长(秒)', '体重']] = df.applymap(lambda x : int(x))
合并
concat
concat语法:pandas.concat(objs=[df1,df2], axis=0, join=‘outer’, ignore_index=False)
- objs:一个列表,内容可以是DataFrame或者Series,可以混合
- axis:默认是0代表按行合并,如果等于1代表按列合并
- join:合并的时候索引的对齐方式,默认是outer join,也可以是inner join
- ignore_index:是否忽略掉原来的数据索引
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
'E': ['E0', 'E1', 'E2', 'E3']
})
df2 = pd.DataFrame({ 'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7'],
'F': ['F4', 'F5', 'F6', 'F7']
})
默认的concat,参数为axis=0、join=outer、ignore_index=False
df = pd.concat(objs=[df1,df2])
print(df)
'''
A B C D E F
0 A0 B0 C0 D0 E0 NaN
1 A1 B1 C1 D1 E1 NaN
2 A2 B2 C2 D2 E2 NaN
3 A3 B3 C3 D3 E3 NaN
0 A4 B4 C4 D4 NaN F4
1 A5 B5 C5 D5 NaN F5
2 A6 B6 C6 D6 NaN F6
3 A7 B7 C7 D7 NaN F7
'''
使用ignore_index=True可以忽略原来的索引
df = pd.concat([df1,df2], ignore_index=True)
print(df)
'''
A B C D E F
0 A0 B0 C0 D0 E0 NaN
1 A1 B1 C1 D1 E1 NaN
2 A2 B2 C2 D2 E2 NaN
3 A3 B3 C3 D3 E3 NaN
4 A4 B4 C4 D4 NaN F4
5 A5 B5 C5 D5 NaN F5
6 A6 B6 C6 D6 NaN F6
7 A7 B7 C7 D7 NaN F7
'''
使用join=inner过滤掉不匹配的列
df = pd.concat([df1,df2], ignore_index=True, join='inner')
print(df)
'''
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
'''
使用axis=1相当于添加新列
df = pd.concat([df1,df2], axis=1)
print(df) # 如运行print(df['A']),那么两个A都会显示
'''
A B C D E A B C D F
0 A0 B0 C0 D0 E0 A4 B4 C4 D4 F4
1 A1 B1 C1 D1 E1 A5 B5 C5 D5 F5
2 A2 B2 C2 D2 E2 A6 B6 C6 D6 F6
3 A3 B3 C3 D3 E3 A7 B7 C7 D7 F7
'''
添加一列Series
s1 = pd.Series(list(range(5)), name="F")
df = pd.concat([df1,s1], axis=1)
print(df)
'''
A B C D E F
0 A0 B0 C0 D0 E0 0
1 A1 B1 C1 D1 E1 1
2 A2 B2 C2 D2 E2 2
3 A3 B3 C3 D3 E3 3
4 NaN NaN NaN NaN NaN 4
'''
s2 = {'F':list(range(5))}
# 报错的样例
# err = pd.concat([df1,s2], axis=1)
添加多列Series
s1 = pd.Series(list(range(5)), name="F")
s2 = pd.Series(['a','b','c','d','e'], name="Q")
df = pd.concat([s1,df1,s2], axis=1)
print(df)
'''
F A B C D E Q
0 0 A0 B0 C0 D0 E0 a
1 1 A1 B1 C1 D1 E1 b
2 2 A2 B2 C2 D2 E2 c
3 3 A3 B3 C3 D3 E3 d
4 4 NaN NaN NaN NaN NaN e
'''
append
append语法:DataFrame.append(other, ignore_index=False)
- append只有按行合并,没有按列合并,相当于concat按行的简写形式
- other:单个dataframe、series、dict,或者列表
- ignore_index:是否忽略掉原来的数据索引
import pandas as pd
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A','B'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
给一个dataframe添加另一个dataframe
df = df1.append(df2)
print(df)
'''
A B
0 1 2
1 3 4
0 5 6
1 7 8
'''
df = df2.append(df1)
print(df)
'''
A B
0 5 6
1 7 8
0 1 2
1 3 4
'''
忽略原来的索引ignore_index=True
df = df1.append(df2, ignore_index=True)
print(df)
'''
A B
0 1 2
1 3 4
2 5 6
3 7 8
'''
可以一行一行的给DataFrame添加数据
df = pd.concat([pd.DataFrame([i], columns=['A']) for i in range(11,16)], ignore_index=True)
print(df)
'''
A
0 11
1 12
2 13
3 14
4 15
'''