当前位置: 首页 > 后端技术 > Python

5个Pandas组合函数的异同

时间:2023-03-26 16:58:56 Python

5个Pandas组合函数的异同1.说明在日常处理数据的过程中,经常会遇到不同dataframe的连接、组合等操作。当你第一次使用它时,你会有点困惑。毕竟后面几个函数的功能大同小异,容易造成混淆。concatjoinmergecombineappend下面用最简单的例子来解释和区分几个函数的作用。>>>将熊猫导入为pd>>>df0=pd.DataFrame({"a":[1,2,3],"b":[4,5,6]})>>>df0ab014125236>>>df1=pd.DataFrame({"c":[2,3,4],"d":[5,6,7]})>>>df1cd0251362472.concatconcat,“concatenation”的完整拼写,允许数据水平或垂直并排组合。2.1行拼接当合并相同列的数据时(2个df列名保持相同,行拼接),可以通过指定轴为0(默认值)来调用。当axis=0时,应该理解为按列方向拼接(向下拼接),即按行拼接。列名需要保持一致,得到的就是想要的行拼接,df1.rename(columns={"c":"a","d":"b"})。>>>pd.concat([df0,df1.rename(columns={"c":"a","d":"b"})],axis=0)ab014125236025136247如果列名不一致,则无法得到想要的行拼接结果。在[9]:pd.concat([df0,df1],axis=0)Out[9]:abcd01.04.0NaNNaN12.05.0NaNNaN23.06.0NaNNaN0NaNNaN2.05.01NaNNaN3.06.02NaNNaN4.07.0总结:行拼接,如果没有产生额外的列,注意保持列名一致。>>>pd.concat([df0,df1],axis=1)abcd014251253623647默认情况下,当水平组合数据(即沿列)时,尝试使用索引。当它们不相同时,您会看到NaN填充非重叠数据,如下所示:>>>df2=df1.copy()>>>df2.index=[1,2,3]>>>pd.concat([df0,df2],axis=1)abcd01.04.0NaNNaN12.05.02.05.023.06.03.06.03NaNNaN4.07.0如果要统一索引进行拼接,首先要重新设置它们的索引:>>>pd.concat([df0.reset_index(drop=True),df2.reset_index(drop=True)],axis=1)abcd014251253623647总结:列拼接,如果没有冗余行,注意索引是一致的3.join与concat相比,join专门用于使用索引连接DataFrame对象之间的列。df0和df1的索引一致:>>>df0.join(df1)abcd014251253623647当索引不一致时,连接默认保留左边DataFrame的行(默认左表为驱动表);如果右侧DataFrame中左侧DataFrame中没有匹配到的索引行,则删除右侧DataFrame并填充Null,如下:>>>df0.join(df2)abcd014NaNNaN1252.05.02363.06.0还可以通过设置how参数来改变驱动表,即SQL中的几种关联连接。#"right"使用df2的索引>>>df0.join(df2,how="right")abcd12.05.02523.06.0363NaNNaN47#"outer"使用联合>>>df0.join(df2,how="outer")abcd01.04.0NaNNaN12.05.02.05.023.06.03.06.03NaNNaN4.07.0#"inner"使用交集>>>df0.join(df2,how="inner")abcd1252523636总结:join是一种基于索引的连接,只有列连接,类似于SQL4。merge相对于join更通用,可以对列和索引进行合并操作。a列的内部关联:>>>df0.merge(df1.rename(columns={"c":"a"}),on="a",how="inner")abd02551366如果想同时保留关联的列,可以这样写:>>>df0.merge(df1,left_on="a",right_on="c")abcd0252513636当两个DataFrame对象具有相同的列时,不是合并,而是通过suffixes参数为这些列重命名设置后缀;默认情况下,左右数据框的后缀分别为“_x”和“_y”,也可以自定义。>>>df0.merge(df1.rename(columns={"c":"a","d":"b"}),on="a",how="outer",后缀=("_l","_r"))ab_lb_r014.0NaN125.05.0236.06.034NaN7.05。combinecombine函数也是作用于两个DataFrame对象,按列合并,但是和上面的函数有很大区别。combine函数的特殊之处在于它接受一个函数参数。此函数采用两个系列,一个用于DataFrame中的每个合并列,并返回一个系列作为对同一列的逐元素操作的最终值。有点乱,我们来看一个例子:>>>deftaking_larger_square(s1,s2):...returns1*s1ifs1.sum()>s2.sum()elses2*s2>>>df0。combine(df1.rename(columns={"c":"a","d":"b"}),taking_larger_square)ab0425193621649take_larger_square函数用于df0中的a列和df1中的b列df0和df1进行操作。在两列a和两列b之间,taking_larger_square取较大列中值的平方。在这种情况下,df1的a和b列将用作生成最终值的方块。这里碰巧df1的a和b都大于df0的a和b。如果df1其中一个大,另一个小,则仍取最大值中的一个作为平方。在[13]中:df0,df1Out[13]:(ab012123234,cd041152263)在[11]中:df0.combine(df1.rename(columns={"c":"a","d":"b"}),taking_larger_square)Out[11]:ab0164125923616总结:结合combine,主要针对两个DataFrame对象Series进行函数处理,其中之一作为结果。6.appendappend函数专门用于将行附加到现有的DataFrame对象,创建一个新的。>>>df0.append(df1.rename(columns={"c":"a","d":"b"}))ab014125236025136247This和concat(,axis=0)具有相同的效果。append的独特之处在于它还可以附加dict对象,这使我们可以灵活地附加不同类型的数据。注意ignore_index必须设置为True,因为dict对象没有DataFrame可以使用的索引信息。>>>df0.append({"a":1,"b":2},ignore_index=True)ab0141252363127.总结concat:按行按列合并数据join:使用索引,mergedatabyrowmerge:按列合并数据,更像一个数据库连接操作欢迎关注个人公众号:单数论