Python pandas中DataFrame中增删行列

1. 概述

  • 添加行: df.loc[]以及df.append()两种方法
  • 添加列: df[]和df.insert()两种方法
  • 添加行列: concat()和reindex()两种方法
  • loc bug解决

2. 添加行

2.1. 采用loc[]方法

loc方法和iloc方法一样,可以索引DataFrame数据,一般是通过data.loc[index, col] = value

# 构造一个空的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

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方法添加多行

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()方法

拼接数据,好处是可以同时新增多个列名和行名

# 如果是遍历添加多行,更高效的方法
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)
  • 输出结果
   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[]

df = pd.DataFrame(columns=['name', 'number'], data=[['cat', 3]])

# 添加一列,计算有多少条腿
df['leg'] = df['number'] * 4
# 添加一列,直接赋值有几个头
df['head'] = 1
  • 输出结果
  name  number  leg  head
0  cat       3   12     1

3.2. 采用insert()

# 使用方法是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)
  • 输出结果
  name  tail  number  leg  head
0  cat     1       3   12     1

3.3. 采用reindex()函数

#  reindex 函数重新设定了一组数据的索引,如果索引在原数据中没有匹配,则以NaN填充。不想以NaN填充用fill_value方法来设置。
# 缺点是要把原有的列名和新列名都加上,如果列名过多比较麻烦
data = data.reindex(columns=['a', 'b', 'name', 'd'], fill_value="example")
print(data)
  • 输出结果
     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方法实现

obj3 = Series(['blue', 'purple', 'yellow'], index = [0, 2, 4])
obj3
#使用ffill实现前向值填充
obj3.reindex(range(6), method = 'ffill')
obj3
  • 输出结果
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方法。
#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').

#错误方法:
#标签索引loc方法(书中的'ix'方法已经不能使用了,loc方法等同原ix方法;制定的loc必须存在,否则报错;建议直接改成reindex方法;
frame.loc[['a', 'b', 'c', 'd'], cols] 
print(frame)

#正确方法:
frame.reindex(['a', 'b', 'c', 'd'],  columns = cols)

5. 参考

发表评论

邮箱地址不会被公开。 必填项已用*标注