pandas 中 DataFrame相关的合并函数总结
- append:添加行
函数功能:将DataFrame/Series/字典形式的数据,或者其列表添加到调用对象中,返回一个新的DataFrame
例:
(1)添加DataFrame:
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
df
A B
x 1 2
y 3 4
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'), index=['x', 'y'])
df.append(df2)
A B
x 1 2
y 3 4
x 5 6
y 7 8
(2)添加Series
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
s1 = pd.Series([9,10],name='z',index =list('AB') )
df.append(s1)
A B
x 1 2
y 3 4
z 9 10
#Series的index和调用的DataFrame不一致
s1 = pd.Series([9,10],name='z',index =list('CD') )
df.append(s1)
A B C D
x 1.0 2.0 NaN NaN
y 3.0 4.0 NaN NaN
z NaN NaN 9.0 10.0
#Series没有设置name属性
s1 = pd.Series([9,10],index =list('AB') )
df.append(s1,ignore_index=True)
A B
0 1 2
1 3 4
2 9 10
注意:Series 的index需要和DataFrame的列一致,否则得到更多的列;
另外,如果添加的Series没有设置name属性,则需要将append函数中的ignore_index设置为True
(3) 添加字典
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
m = {'A':11,'B':12}
df.append(m,ignore_index=True)
A B
0 1 2
1 3 4
2 11 12
注意:当添加对象是字典时,ignore_index属性必须设置为True
- combine:按列合并
combine 必填参数有两个,other:联合的另一个DataFrame,func:将两个DataFrame 中的相同列作为输入、合并,最后输出一列。
(1)列维度合并
#选取总和最小的列
df1 = pd.DataFrame({'A': [0, 1], 'B': [4, 5]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
take_smaller = lambda s1, s2: s1 if s1.sum() < s2.sum() else s2
df1.combine(df2, take_smaller)
A B
0 0 3
1 1 3
解释:df1 A列的总和为1,df2 A列的总和为2,因为取总和最小的列,所以结果A 列返回的是df1的A列。同理,df1 B列的总和为9,df2 B列的总和为6,所以结果B列返回的是df2的B列
(2)字段维度选择
df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine(df2, np.minimum)
A B
0 1 2
1 0 3
解释:返回的结果是将两个DataFrame中,每一个元素进行比较,选出最小值。
例如,结果中 0行A列是比较 df1中0行A列的值5和 df2中0行A列的值1,选出最小值1返回。
参数:fill_value 可以对列中的空值进行赋值
df1 = pd.DataFrame({'A': [0, 0], 'B': [None, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [1, 3]})
df1.combine(df2, take_smaller, fill_value=-5)
A B
0 0 -5.0
1 0 4.0
如果fill_value 没有传参,这默认None值默认不做处理
df1 = pd.DataFrame({'A': [0, 0,0],'B': [None, 4,None]})
df2 = pd.DataFrame({'A': [1, 1,1], 'B': [0, 3,None]})
df1.combine(df2, take_smaller)
A B
0 0 0.0
1 0 3.0
2 0 NaN