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
'''

参考文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值