pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法

2023-11-17

实验目的

熟练掌握pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法

实验原理

concat合并

pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False)
参数

objs: series,dataframe或者是panel构成的序列lsit。
axis: 需要合并链接的轴,0是行,1是列,默认为axis=0。
join:连接的方式 inner,或者outer,默认为join=‘outer’
keys:合并的同时增加分区。
ignore_index:忽略索引,默认为False,当为True时,合并的两表就按列字段对齐。

merge合并

pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效。

pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(’_x’, ‘_y’), copy=True, indicator=False,validate=None)

merge的参数

left/right:两个不同的DataFrame
on:指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。right_on:右则DataFrame中用作 连接键的列名。
left_index:使用左则DataFrame中的行索引做为连接键。
right_index:使用右则DataFrame中的行索引做为连接键。
how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner。
sort:根据DataFrame合并的keys按字典顺序排序,默认是True,如果置false可以提高表现。
suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’,’_y’)
copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自于左边(left_only)、两者(both)。

merge的默认合并方法:merge用于表内部基于 index-on-index 和 index-on-column(s) 的合并,但默认是基于index来合并。

join连接:主要用于索引上的合并

join(self, other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’,sort=False)

其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left

1.默认按索引合并,可以合并相同或相似的索引,不管他们有没有重叠列。
2.可以连接多个DataFrame
3.可以连接除索引外的其他列
4.连接方式用参数how控制
5.通过lsuffix=’’, rsuffix=’’ 区分相同列名的列

实验环境

Python 3.6.1
Jupyter

实验内容
练习pandas中DataFrame的修改元素值、缺失值处理、合并操作。

代码部分

import numpy as np
import pandas as pd

1.修改数据

1) 通过字典对象创建一个DataFrame。

dates = pd.date_range('20130101', periods=6)  
dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))  
df
A B C D
2013-01-01 0.896387 -0.983990 -0.633715 0.224435
2013-01-02 0.173375 -0.220575 -1.010174 0.494923
2013-01-03 0.579714 0.303940 2.790600 0.302989
2013-01-04 -1.684962 -0.788070 -0.265911 -0.907506
2013-01-05 -0.108375 -0.799685 2.212832 1.557938
2013-01-06 0.396521 -0.087139 0.056659 1.267565

2) .新建一个值为[1,2,3,4,5,6],索引index为2013-01-02到2013-01-07的Series,并将series赋值给df作为df新增的F列

s1=pd.Series([1,2,3,4,5,6],index=pd.date_range('20130102',periods=6))  
s1
2013-01-02    1
2013-01-03    2
2013-01-04    3
2013-01-05    4
2013-01-06    5
2013-01-07    6
Freq: D, dtype: int64
df['F']=s1  
df
A B C D F
2013-01-01 0.896387 -0.983990 -0.633715 0.224435 NaN
2013-01-02 0.173375 -0.220575 -1.010174 0.494923 1.0
2013-01-03 0.579714 0.303940 2.790600 0.302989 2.0
2013-01-04 -1.684962 -0.788070 -0.265911 -0.907506 3.0
2013-01-05 -0.108375 -0.799685 2.212832 1.557938 4.0
2013-01-06 0.396521 -0.087139 0.056659 1.267565 5.0

3) 通过at方法把满足df中dates[0],列A的值修改为0

df.at[dates[0],'A']=0 
df
A B C D F
2013-01-01 0.000000 -0.983990 -0.633715 0.224435 NaN
2013-01-02 0.173375 -0.220575 -1.010174 0.494923 1.0
2013-01-03 0.579714 0.303940 2.790600 0.302989 2.0
2013-01-04 -1.684962 -0.788070 -0.265911 -0.907506 3.0
2013-01-05 -0.108375 -0.799685 2.212832 1.557938 4.0
2013-01-06 0.396521 -0.087139 0.056659 1.267565 5.0

4) 使用iat方法修改df中行下标为0,列下标为1的值等于0

df.iat[0,1]=0
df
A B C D F
2013-01-01 0.000000 0.000000 -0.633715 0.224435 NaN
2013-01-02 0.173375 -0.220575 -1.010174 0.494923 1.0
2013-01-03 0.579714 0.303940 2.790600 0.302989 2.0
2013-01-04 -1.684962 -0.788070 -0.265911 -0.907506 3.0
2013-01-05 -0.108375 -0.799685 2.212832 1.557938 4.0
2013-01-06 0.396521 -0.087139 0.056659 1.267565 5.0

5) 使用loc方法把df的D列值修改为5*len(df)

df.loc[:,'D']=np.array([5]*len(df))
df
A B C D F
2013-01-01 0.000000 0.000000 -0.633715 5 NaN
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0
2013-01-03 0.579714 0.303940 2.790600 5 2.0
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0
2013-01-05 -0.108375 -0.799685 2.212832 5 4.0
2013-01-06 0.396521 -0.087139 0.056659 5 5.0

6) 使用copy方法将df赋值给df2,使用where语句将df2中满足df2>0条件的值修改为-df2。

df2=df.copy()  
df2
A B C D F
2013-01-01 0.000000 0.000000 -0.633715 5 NaN
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0
2013-01-03 0.579714 0.303940 2.790600 5 2.0
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0
2013-01-05 -0.108375 -0.799685 2.212832 5 4.0
2013-01-06 0.396521 -0.087139 0.056659 5 5.0
df2[df2>0]=-df2
df2
A B C D F
2013-01-01 0.000000 0.000000 -0.633715 -5 NaN
2013-01-02 -0.173375 -0.220575 -1.010174 -5 -1.0
2013-01-03 -0.579714 -0.303940 -2.790600 -5 -2.0
2013-01-04 -1.684962 -0.788070 -0.265911 -5 -3.0
2013-01-05 -0.108375 -0.799685 -2.212832 -5 -4.0
2013-01-06 -0.396521 -0.087139 -0.056659 -5 -5.0

2.缺失值

1)使用reindex方法将df的行列索引同时重新索引,使行index=date[0:4],列索引culumns=list(df.columns+[‘E’]),并返回一个新的数据帧df1,然后使用loc方法将df1中行索引为dates[0]和dates[1],列为“E"的值修改为1。

df1=df.reindex(index=dates[0:4],columns=list(df.columns)+['E'])  
df1
A B C D F E
2013-01-01 0.000000 0.000000 -0.633715 5 NaN NaN
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0 NaN
2013-01-03 0.579714 0.303940 2.790600 5 2.0 NaN
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0 NaN
df1.loc[dates[0]:dates[1],'E']=1  
df1  
A B C D F E
2013-01-01 0.000000 0.000000 -0.633715 5 NaN 1.0
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0 1.0
2013-01-03 0.579714 0.303940 2.790600 5 2.0 NaN
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0 NaN

2) 使用dropna方法删除df1中任何包含缺失值的行。

df1.dropna(how='any')
A B C D F E
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0 1.0

3) 使用fillna方法,将df1中所有的缺失值用5填充

df1
A B C D F E
2013-01-01 0.000000 0.000000 -0.633715 5 NaN 1.0
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0 1.0
2013-01-03 0.579714 0.303940 2.790600 5 2.0 NaN
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0 NaN
df1.fillna(value=5)
A B C D F E
2013-01-01 0.000000 0.000000 -0.633715 5 5.0 1.0
2013-01-02 0.173375 -0.220575 -1.010174 5 1.0 1.0
2013-01-03 0.579714 0.303940 2.790600 5 2.0 5.0
2013-01-04 -1.684962 -0.788070 -0.265911 5 3.0 5.0

4) 使用isnull方法判断df1中的值是否为缺失值,是缺失值返回True,否则返回False,返回一个由布尔值组成的数据帧

pd.isnull(df1)
A B C D F E
2013-01-01 False False False False True False
2013-01-02 False False False False False False
2013-01-03 False False False False False True
2013-01-04 False False False False False True

5) 使用notnull判断df1中的值是否为缺失值,返回一个由布尔值组成的数据帧

pd.notnull(df1)
A B C D F E
2013-01-01 True True True True False True
2013-01-02 True True True True True True
2013-01-03 True True True True True False
2013-01-04 True True True True True False

3.合并

1)使用concat进行合并

(1)创建数据帧df1、df2、df3,使用concat函数将df1\df2\df3进行合并

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']},index=[0, 1, 2, 3])  
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],'B': ['B4', 'B5', 'B6', 'B7'],'C': ['C4', 'C5', 'C6', 'C7'],'D': ['D4', 'D5', 'D6', 'D7']},index=[4, 5, 6, 7])  
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],'B': ['B8', 'B9', 'B10', 'B11'],'C': ['C8', 'C9', 'C10', 'C11'],'D': ['D8', 'D9', 'D10', 'D11']},index=[8, 9, 10, 11])  
df1
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
df3
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
result = pd.concat([df1,df2,df3])  
result
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
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
print('df1:\n',df1,'\ndf2:\n',df2,'\ndf3:\n','\nresult:\n',result)  
df1:
     A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3 
df2:
     A   B   C   D
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7 
df3:
 
result:
       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
8    A8   B8   C8   D8
9    A9   B9   C9   D9
10  A10  B10  C10  D10
11  A11  B11  C11  D11

(2)将df1,df2,df3进行合并,并将合并后的数据帧进行分区为keys=[‘x’,‘y’,‘z’]

result1 = pd.concat([df1,df2,df3], keys=['x', 'y', 'z'])  
print(result1)
        A    B    C    D
x 0    A0   B0   C0   D0
  1    A1   B1   C1   D1
  2    A2   B2   C2   D2
  3    A3   B3   C3   D3
y 4    A4   B4   C4   D4
  5    A5   B5   C5   D5
  6    A6   B6   C6   D6
  7    A7   B7   C7   D7
z 8    A8   B8   C8   D8
  9    A9   B9   C9   D9
  10  A10  B10  C10  D10
  11  A11  B11  C11  D11

(3)新建一个数据帧df4,将df1与df4进行列项合并,axis=1。

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],'D': ['D2', 'D3', 'D6', 'D7'],'F': ['F2', 'F3', 'F6', 'F7']},index=[2, 3, 6, 7])  
df4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
result2=pd.concat([df1,df4],axis=1)  
print(result2) 
     A    B    C    D    B    D    F
0   A0   B0   C0   D0  NaN  NaN  NaN
1   A1   B1   C1   D1  NaN  NaN  NaN
2   A2   B2   C2   D2   B2   D2   F2
3   A3   B3   C3   D3   B3   D3   F3
6  NaN  NaN  NaN  NaN   B6   D6   F6
7  NaN  NaN  NaN  NaN   B7   D7   F7

(4)df1与df4进行列项合并axis=1,合并方式为内部合并join=‘inner’

result3=pd.concat([df1,df4],axis=1,join='inner')  
print(result3)
    A   B   C   D   B   D   F
2  A2  B2  C2  D2  B2  D2  F2
3  A3  B3  C3  D3  B3  D3  F3

(5)将df1与df4进行列项合并axis=1,结果只保留合并后df1索引的行join_axes=[df1.index]。

df1.index
Int64Index([0, 1, 2, 3], dtype='int64')
result4 = pd.concat([df1,df4],axis=1)  
print(result4)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-41-b69245b6f21a> in <module>
----> 1 result4 = pd.concat([df1,df4],axis=1,join=[df1.index])
      2 print(result4)


C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)
    272     ValueError: Indexes have overlapping values: ['a']
    273     """
--> 274     op = _Concatenator(
    275         objs,
    276         axis=axis,


C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in __init__(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)
    317             self.intersect = True
    318         else:  # pragma: no cover
--> 319             raise ValueError(
    320                 "Only can inner (intersect) or outer (union) join the other axis"
    321             )


ValueError: Only can inner (intersect) or outer (union) join the other axis

(6)将df1与df4合并,忽略行索引ignore_index=True

result5=pd.concat([df1,df4],ignore_index=True)  
print(result5)  
     A   B    C   D    F
0   A0  B0   C0  D0  NaN
1   A1  B1   C1  D1  NaN
2   A2  B2   C2  D2  NaN
3   A3  B3   C3  D3  NaN
4  NaN  B2  NaN  D2   F2
5  NaN  B3  NaN  D3   F3
6  NaN  B6  NaN  D6   F6
7  NaN  B7  NaN  D7   F7

(7)创建一个名为s1的Series值为[‘X0’, ‘X1’, ‘X2’, ‘X3’],name=‘X’,将df1与s1进行列项合并。

s1=pd.Series(['X0', 'X1', 'X2', 'X3'],name='X')  
result6=pd.concat([df1,s1],axis=1)  
print(result6)
    A   B   C   D   X
0  A0  B0  C0  D0  X0
1  A1  B1  C1  D1  X1
2  A2  B2  C2  D2  X2
3  A3  B3  C3  D3  X3

(8)将df1与s1进行列项合并,忽略索引 ignore_index=True。

result=pd.concat([df1,s1],axis=1,ignore_index=True)  
print(df1,s1,result) 
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3 0    X0
1    X1
2    X2
3    X3
Name: X, dtype: object     0   1   2   3   4
0  A0  B0  C0  D0  X0
1  A1  B1  C1  D1  X1
2  A2  B2  C2  D2  X2
3  A3  B3  C3  D3  X3

(9)创建三个Series分别为s2,s3,s4,将三个Series进行合并,使用keys=[‘red’,‘blue’,‘yellow’]对合并后数据帧的列改名。

s2 = pd.Series([0, 1, 2, 3], name='foo')  
s3 = pd.Series([0, 1, 2, 3])  
s4 = pd.Series([0, 1, 4, 5])  
pd.concat([s2,s3,s4],axis=1,keys=['red','blue','yellow'])  
red blue yellow
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5

(10)将df1,df2,df3,作为值,x,y,z作为键构建名为pieces的字典,然后对pieces使用concat进行合并,并令参数keys=[‘z’,‘y’]

pieces={'x':df1,'y':df2,'z':df3}  
result = pd.concat(pieces, keys=['z', 'y'])  
pieces
{'x':     A   B   C   D
 0  A0  B0  C0  D0
 1  A1  B1  C1  D1
 2  A2  B2  C2  D2
 3  A3  B3  C3  D3,
 'y':     A   B   C   D
 4  A4  B4  C4  D4
 5  A5  B5  C5  D5
 6  A6  B6  C6  D6
 7  A7  B7  C7  D7,
 'z':       A    B    C    D
 8    A8   B8   C8   D8
 9    A9   B9   C9   D9
 10  A10  B10  C10  D10
 11  A11  B11  C11  D11}
result
A B C D
z 8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
y 4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7

2)使用append进行合并

(1)使用append方法将df1与df2合并。

df1.append(df2)  
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

(2)使用append方法将df1与df4合并

df1.append(df4)
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B2 NaN D2 F2
3 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7

(3)使用append方法将df1与df2、df3合并。

df1.append([df2,df3])  
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
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11

(4)将df1与df4进行合并,忽略索引ignore_index=True

result=df1.append(df4,ignore_index=True)  
result
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
4 NaN B2 NaN D2 F2
5 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7

3) 使用merge进行合并

(1)创建两个数据帧left、right,使用merge函数按key列将left与right进行连接。

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})  
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})  
result = pd.merge(left, right, on='key')  
print( left,right,result)  
  key   A   B
0  K0  A0  B0
1  K1  A1  B1
2  K2  A2  B2
3  K3  A3  B3   key   C   D
0  K0  C0  D0
1  K1  C1  D1
2  K2  C2  D2
3  K3  C3  D3   key   A   B   C   D
0  K0  A0  B0  C0  D0
1  K1  A1  B1  C1  D1
2  K2  A2  B2  C2  D2
3  K3  A3  B3  C3  D3

复合key的合并方法,使用merge的时候可以选择多个key作为复合可以来对齐合并。

(2)创建两个数据帧left、right,使用merge函数按[key1,key2]列将left与right进行连接。

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})  
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})  
result = pd.merge(left, right, on=['key1', 'key2'])  
print( left,right,result)  
  key1 key2   A   B
0   K0   K0  A0  B0
1   K0   K1  A1  B1
2   K1   K0  A2  B2
3   K2   K1  A3  B3   key1 key2   C   D
0   K0   K0  C0  D0
1   K1   K0  C1  D1
2   K1   K0  C2  D2
3   K2   K0  C3  D3   key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2

(3)使用merge函数按[key1,key2]列将left与right进行左表连接

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})  
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})  
result = pd.merge(left, right, how='left', on=['key1', 'key2'])  
print( left,right,result)  
  key1 key2   A   B
0   K0   K0  A0  B0
1   K0   K1  A1  B1
2   K1   K0  A2  B2
3   K2   K1  A3  B3   key1 key2   C   D
0   K0   K0  C0  D0
1   K1   K0  C1  D1
2   K1   K0  C2  D2
3   K2   K0  C3  D3   key1 key2   A   B    C    D
0   K0   K0  A0  B0   C0   D0
1   K0   K1  A1  B1  NaN  NaN
2   K1   K0  A2  B2   C1   D1
3   K1   K0  A2  B2   C2   D2
4   K2   K1  A3  B3  NaN  NaN

(4)使用merge函数按[key1,key2]列将left与right进行右表连接

result = pd.merge(left, right, how='right', on=['key1', 'key2'])  
print(result) 
  key1 key2    A    B   C   D
0   K0   K0   A0   B0  C0  D0
1   K1   K0   A2   B2  C1  D1
2   K1   K0   A2   B2  C2  D2
3   K2   K0  NaN  NaN  C3  D3

(5)使用merge函数按[key1,key2]列将left与right进行外表连接

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])  
print(result)  
  key1 key2    A    B    C    D
0   K0   K0   A0   B0   C0   D0
1   K0   K1   A1   B1  NaN  NaN
2   K1   K0   A2   B2   C1   D1
3   K1   K0   A2   B2   C2   D2
4   K2   K1   A3   B3  NaN  NaN
5   K2   K0  NaN  NaN   C3   D3

(6)使用merge函数按key1,key2列将left与right进行内表连接。

result = pd.merge(left, right, how='inner', on=['key1', 'key2'])  
print(result)  
  key1 key2   A   B   C   D
0   K0   K0  A0  B0  C0  D0
1   K1   K0  A2  B2  C1  D1
2   K1   K0  A2  B2  C2  D2

(7)创建两个都只有A、B两列的数据帧left,right,使用merge函数按B列将left与right进行外表连接,可以看到除连接列B以外的列名相同时,会在列名后加上区分的后缀。

left = pd.DataFrame({'A' : [1,2], 'B' : [2, 2]})  
right = pd.DataFrame({'A' : [4,5,6], 'B': [2,2,2]})  
result = pd.merge(left, right, on='B', how='outer')  
print(result)
   A_x  B  A_y
0    1  2    4
1    1  2    5
2    1  2    6
3    2  2    4
4    2  2    5
5    2  2    6

(8)创建两个数据帧df1、df2,使用merge函数按col1列将df1与df2进行外表连接,并使用参数indicator显示出每列值在合并列中是否出现。

df1 = pd.DataFrame({'col1': [0, 1], 'col_left':['a', 'b']})  
df2 = pd.DataFrame({'col1': [1, 2, 2],'col_right':[2, 2, 2]})  
pd.merge(df1, df2, on='col1', how='outer', indicator=True) 
col1 col_left col_right _merge
0 0 a NaN left_only
1 1 b 2.0 both
2 2 NaN 2.0 right_only
3 2 NaN 2.0 right_only

4) 使用join进行连接

(1)创建两个数据帧left、right,使用join方法将left与right连接

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2']},index=['K0', 'K1', 'K2'])  
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],'D': ['D0', 'D2', 'D3']},index=['K0', 'K2', 'K3'])  
result = left.join(right)  
print(left,'\n',right,'\n',result)  
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2 
      C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3 
      A   B    C    D
K0  A0  B0   C0   D0
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2

(2)使用join方法将left与right进行外表连接

result = left.join(right, how='outer')  
print(left,'\n',right,'\n',result)  
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2 
      C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3 
       A    B    C    D
K0   A0   B0   C0   D0
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3  NaN  NaN   C3   D3

(3)使用join方法将left与right进行内表连接。

result = left.join(right, how='inner')  
print(left,'\n',right,'\n',result)  
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2 
      C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3 
      A   B   C   D
K0  A0  B0  C0  D0
K2  A2  B2  C2  D2

(4)使用merge函数按左右表索引将left与right进行外表连接

result = pd.merge(left, right, left_index=True, right_index=True, how='outer')  
print(left,'\n',right,'\n',result)  
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2 
      C   D
K0  C0  D0
K2  C2  D2
K3  C3  D3 
       A    B    C    D
K0   A0   B0   C0   D0
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3  NaN  NaN   C3   D3

(5)创建两个数据帧left、right,使用join方法按key列将left与right连接

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3'], 'key': ['K0', 'K1', 'K0', 'K1']})  
right = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},index=['K0', 'K1'])  
result = left.join(right, on='key')  
print(left,'\n',right,'\n',result)  
    A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K0
3  A3  B3  K1 
      C   D
K0  C0  D0
K1  C1  D1 
     A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K0  C0  D0
3  A3  B3  K1  C1  D1
result = pd.merge(left, right, left_on='key', right_index=True,how='left', sort=False)  
print(left,'\n',right,'\n',result)  
    A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K0
3  A3  B3  K1 
      C   D
K0  C0  D0
K1  C1  D1 
     A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K0  C0  D0
3  A3  B3  K1  C1  D1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法 的相关文章

  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • Pandas Merge (pd.merge) 如何设置索引和连接

    我有两个 pandas 数据框 dfLeft 和 dfRight 以日期作为索引 dfLeft cusip factorL date 2012 01 03 XXXX 4 5 2012 01 03 YYYY 6 2 2012 01 04 XX
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 文件搜索工具Everything

    Everything是由voidtools开发的一款文件搜索工具 这款软件是基于名称实时定位文件和目录 Everything功能强大 体积小巧 第一次安装使用时会建立一个索引数据库 将所有文件和文件夹的名称导入其中 后续使用能够以极快的速度
  • 动态链接库的创建和调用

    1 CManageCounter h 头文件 TEMPLATEDLL EXPORTS 在 配置属性 gt c c gt 预处理器 gt 预处理定义 注 自己命名 ifdef TEMPLATEDLL EXPORTS define TRADEG
  • 大一c语言选择题库及答案,c语言选择题(大一c语言编程题库)

    第一个结果是1 因为c语言中没有布尔类型 把1当作true 0当作false 看第一题 是逻辑与运算符 返回结果只会是1或0 即真或假 x 15结果大于1 被认为是真 C语言中 对文件操作的一般步骤是 A 打开文件 gt 操作文件 gt 关
  • Suricata + Wireshark离线流量日志分析

    目录 一 访问一个404网址 触发监控规则 1 使用python搭建一个虚拟访问网址 2 打开Wireshark 抓取流量监控 3 在Suricata分析数据包 流量分析经典题型 入门题型 题目 Cephalopod 图片提取 进阶题型 题
  • Java中的异常

    异常Exception 是指程序运行时 由于输入错误 网络 程序逻辑等原因导致运行时出现的问题 出现异常时 程序会暂时中断执行 并根据产生异常的原因 创建对应异常类型的异常对象 并抛出给JVM捕获处理 1 Java中的常见异常 1 Null
  • HTML5 简介及基础教程

    什么是 HTML5 HTML5是一种用于创建Web页面和应用程序的标记语言 是HTML的第五个版本 HTML5是由万维网联盟 W3C 和网络超文本应用技术工作组 WHATWG 共同开发的 并于2014年10月推出了最终版本 HTML5包括一
  • WebRTC源码架构浅析

    http www oschina net question 35855 121850
  • 【Python基础】Python简介

    开篇 从本篇文章开始 笔者将带着大家一起学习Python的入门基础知识 自从人工智能 大数据行业的兴起 Python变得炙手可热 成为了近几年最流行的语言之一 2018年 Python 语言上升了 3 62 其次是Visual Basic
  • AI算法工程师

    目录 机器学习 概率图模型 之 隐马尔可夫模型 HMM 一 马尔科夫链 二 HMM 的基本概念 1 HMM 背景与定义 2 HMM 的两个基本假设 3 确定 HMM 的两个空间和三组参数 三 HMM 三个基本问题 导图 四 HMM 相关算法
  • BLE MESH在配网广播中的Service UUID:1827与1828

    Mesh Provisioning UUID 1827 是一种服务的UUID 一般在广播包中中代表设备为未配网设备 也用于给配网器进行识别 在该服务下还有两个UUID 0x2ADB 用于写 0x2ADC 用于上报 在使用GATT配网阶段的数
  • java stack训练(1)

    有效的括号 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 class Solution public boolean isValid String s if
  • proteus 8.8 sp1 (含汉化、破解)安装方法

    若是按照此方法存在问题 欢迎大家留言评论 一 下载地址 链接 https pan baidu com s 1VtYO2dwKRV bMSG6xy6OEQ 提取码 pp9q 二 软件介绍 proteus软件在单片机仿真上面比较优越 8 6版本
  • linux与centos的关系

    首先大家应该都知道 操作系统主要分3个部分 分别是 内核 库 应用程序 内核主要管理与硬件的直接交互的原语代码就类似dao层的一个方法 是原子性的 而库是对内核的进一步封装 当一个功能需要多个原语时 就比如有的程序 需要键盘的输入 还需要显
  • UTSC-TK2016工具集使用笔记

    1 Pcap2Session ps1 对原始流量文件进行切分 以会话 所有层 会话 应用层 流 所有层 流 应用层的形式对原始流量文件进行切分 删除文件长度为0的数据 删除重复文件 生成2 Session文件夹 2 ProcessSessi
  • 数据结构实训-学生信息管理程序C语言版

    问题描述 学生信息包括 学号 姓名 年龄 性别 出生年月 地址 电话和 E mail等 试设计一个学生信息管理程序 实现学生信息的电子化管理 要求 使用文件方式存储数据 采用链表组织学生数据 基本要求 2 基本要求 系统以菜单方式工作 学生
  • java计算两个日期之间相差天数和相隔天数详解

    大家看到文章标题 两个日期之间相差天数和相隔天数 是否有疑惑呢 从中文字面理解 相差 和 相隔 是有区别的 然而就是这些区别害死很多人 却没有发现 在大量新增统计时是差之毫厘谬以千里 我能都发现是因为一个偶然的机会 一个项目运行几年却没有人
  • Ubuntu20.04安装后,root账户无法登录,ssh无法远程连接处理方法

    最近一直在用Ubuntu系统 发现了一些规律性的东西 每当安装完系统就得去做一些事情 要不然无法正常丝滑的使用 我把这几个罗列出来 装机的步骤我就省了 比较简单跟着向导来就行 不要最小化安装就行 1 更换apt 源为阿里云镜像源 下载包的时
  • 在前端页面下拉框动态显示数据库查询出来的结果,供客户勾选,限制客户自建字段(java版)

    最终效果 案例 前端代码 首先引入标签库jar和html代码 div class form group div
  • 08黑马笔记之栈的应用_就近匹配(括号)

    08黑马笔记之栈的应用 就近匹配 括号 思想 前提 使用栈的链式存储来实现 1 遇到左括号就放进栈中 再遇到右括号就将左括号从栈中删除 若栈中没有元素或者不是左括号 则说明右括号匹配失败 以上是判断右括号不匹配的 下面是判断左括号不匹配 2
  • pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法

    实验目的 熟练掌握pandas中DataFrame的修改元素值 缺失值处理 合并操作的方法 实验原理 concat合并 pd concat objs axis 0 join outer join axes None ignore index