1. 概述
- 添加行: df.loc[]以及df.append()两种方法
- 添加列: df[]和df.insert()两种方法
- 添加行列: concat()和reindex()两种方法
- loc bug解决
2. 添加行
2.1. 采用loc[]方法
loc方法和iloc方法一样,可以索引DataFrame数据,一般是通过data.loc[index, col] = value
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 构造一个空的dataframe import pandas as pd df = pd.DataFrame(columns=['name', 'number']) # loc[]中需要加入的是插入地方dataframe的索引,默认是整数型 df.loc[1] = ['cat', 3] df.loc['a'] = ['123',30] df.loc[:, 'd'] = 0 print(df) #输出 name number d 1 cat 3 0 a 123 30 0 |
2.2. 采用append()方法
2.2.1. 采用append方法合并两个dataframe
1 2 3 4 5 6 7 8 9 10 11 12 |
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) # 合并 ignore_index设置为 True可以重新排列索引 append_df = df.append(df2, ignore_index=True) print(append_df) #输出 A B 0 1 2 1 3 4 2 5 6 3 7 8 |
2.2.2. 采用append方法添加多行
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import pandas as pd df = pd.DataFrame(columns=['A']) for i in range(5): df = df.append({'A': i}, ignore_index=True) print(df) #输出 A 0 0 1 1 2 2 3 3 4 4 |
2.3. 采用concat()方法
拼接数据,好处是可以同时新增多个列名和行名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 如果是遍历添加多行,更高效的方法 import pandas as pd import numpy as np df1 = pd.concat([pd.DataFrame([i], columns=['A']) for i in range(5)], ignore_index=True) print(df1) data = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), columns=['a', 'b', 'c']) print(data) # column末尾添加一行新列'd',并填充0; data.shape[1]表示列总长度; data.insert(data.shape[1], 'd', 0) # column末尾添加一行新列'e',并填充0; data['e'] = 0 #合并DateFrame data = pd.concat([data, pd.DataFrame(columns=['f'])], sort=False) print(data) |
- 输出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
A 0 0 1 1 2 2 3 3 4 4 a b c 0 1 2 3 1 4 5 6 2 7 8 9 a b c d e f 0 1.0 2.0 3.0 0.0 0.0 NaN 1 4.0 5.0 6.0 0.0 0.0 NaN 2 7.0 8.0 9.0 0.0 0.0 NaN |
3. 添加列
3.1. 采用df[]
1 2 3 4 5 6 |
df = pd.DataFrame(columns=['name', 'number'], data=[['cat', 3]]) # 添加一列,计算有多少条腿 df['leg'] = df['number'] * 4 # 添加一列,直接赋值有几个头 df['head'] = 1 |
- 输出结果
1 2 |
name number leg head 0 cat 3 12 1 |
3.2. 采用insert()
1 2 3 4 5 6 7 8 9 |
# 使用方法是DataFrame.insert(loc, column, value, allow_duplicates=False) # (添加列位置索引序号,添加列名, 数值, 是否允许列名重复) df.insert(1, 'tail', 1, allow_duplicates=False) #value值通常为列表 print(df) #插入最前面 #df.insert(loc=0, column='player', value=player_vals) #插入最后面 #df.insert(loc=len(df.columns), column='player', value=player_vals) |
- 输出结果
1 2 |
name tail number leg head 0 cat 1 3 12 1 |
3.3. 采用reindex()函数
1 2 3 4 |
# reindex 函数重新设定了一组数据的索引,如果索引在原数据中没有匹配,则以NaN填充。不想以NaN填充用fill_value方法来设置。 # 缺点是要把原有的列名和新列名都加上,如果列名过多比较麻烦 data = data.reindex(columns=['a', 'b', 'name', 'd'], fill_value="example") print(data) |
- 输出结果
1 2 3 4 |
a b name d 0 1.0 2.0 example 0.0 1 4.0 5.0 example 0.0 2 7.0 8.0 example 0.0 |
- Series的reindex用法
如果没有对应数值,需要取前一个索引的值填充,可用ffill方法实现
1 2 3 4 5 |
obj3 = Series(['blue', 'purple', 'yellow'], index = [0, 2, 4]) obj3 #使用ffill实现前向值填充 obj3.reindex(range(6), method = 'ffill') obj3 |
- 输出结果
1 2 3 4 5 6 7 8 9 10 11 12 |
0 blue 2 purple 4 yellow dtype: object 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object |
- DataFrame的reindex方法: 区别主要在于,DataFrame可以对index或columns使用reindex方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#DataFrame使用reindex方法 import numpy as np frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index = ['a', 'c', 'd'], columns = ['Nohn', 'Goos', 'Bidu']) print(frame) # 输出: Nohn Goos Bidu a 0 1 2 c 3 4 5 d 6 7 8 frame.reindex(['a', 'b', 'c', 'd']) print(frame) # 输出: Nohn Goos Bidu a 0.0 1.0 2.0 b NaN NaN NaN c 3.0 4.0 5.0 d 6.0 7.0 8.0 cols = ['Nohn', 'Goos', 'Bidu', 'Tesla'] frame.reindex(columns = cols) print(frame) # 输出: Nohn Goos Bidu Tesla a 0.0 1.0 2.0 NaN b NaN NaN NaN NaN c 3.0 4.0 5.0 NaN d 6.0 7.0 8.0 NaN #对于之前没有NaN,现在需要填充的,填充前值;已经是NaN的不做改动; #frame = frame.reindex(index = ['a', 'b', 'c', 'd'], columns = cols,method = 'ffill') #对于已经是NaN的数值,检查到后就填充前值;已经是NaN的改动; frame.reindex(index = ['a', 'b', 'c', 'd'], columns = cols).ffill() # bfill/nearest # pad / ffill: Propagate last valid observation forward to next valid. # backfill / bfill: Use next valid observation to fill gap. # nearest: Use nearest valid observations to fill gap. print(frame) # 输出: Nohn Goos Bidu Tesla a 0.0 1.0 2.0 NaN b 0.0 1.0 2.0 NaN c 3.0 4.0 5.0 NaN d 6.0 7.0 8.0 NaN |
4. 错误解决: Passing list-likes to .loc or [] with any missing labels
KeyError: "Passing list-likes to .loc or [] with any missing labels is no longer supported. The following labels were missing: Index(['b'], dtype='object').
1 2 3 4 5 6 7 |
#错误方法: #标签索引loc方法(书中的'ix'方法已经不能使用了,loc方法等同原ix方法;制定的loc必须存在,否则报错;建议直接改成reindex方法; frame.loc[['a', 'b', 'c', 'd'], cols] print(frame) #正确方法: frame.reindex(['a', 'b', 'c', 'd'], columns = cols) |
5. 参考
赞赏微信赞赏
支付宝赞赏