当前位置: 首页 > 知识库问答 >
问题:

迭代地向熊猫数据框添加计算的列,然后只添加新数据(python 3.7.1)

端木弘方
2023-03-14

我有一个初始数据帧df1:

    df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])

        a   b   c   d   e
    0   1   B   C   D   E
    1   2   B   C   D   E
    2   3   B   C   D   E
    3   4   B   C   D   E
    4   5   B   C   D   E

然后,我根据df1列值计算一些新参数,创建一个新的df2,并在列名“a”上与df1合并。

    df2 = pd.DataFrame(np.array([[1, 'F', 'G'], [2, 'F', 'G']]), columns=['a', 'f', 'g'])

        a   f   g
    0   1   F   G
    1   2   F   G
    df1 = pd.merge(df1, df2,  how='left', left_on=['a'], right_on = ['a'])

        a   b   c   d   e   f   g
    0   1   B   C   D   E   F   G
    1   2   B   C   D   E   F   G
    2   3   B   C   D   E   NaN NaN
    3   4   B   C   D   E   NaN NaN
    4   5   B   C   D   E   NaN NaN

这工作得非常好,但在另一个循环事件中,我创建了一个与df2具有相同列的df3,但在本例中合并不起作用,它没有考虑到相同列已经在df1中。

重要提示:这仅用于说明目的,需要添加数千个新数据帧,每个循环步骤一个。

    df3 = pd.DataFrame(np.array([[3, 'F', 'G']]), columns=['a', 'f', 'g'])

        a   f   g
    0   3   F   G
df1 = pd.merge(df1, df3,  how='left', left_on=['a'], right_on = ['a'])

        a   b   c   d   e   f_x g_x f_y g_y
    0   1   B   C   D   E   F   G   NaN NaN
    1   2   B   C   D   E   F   G   NaN NaN
    2   3   B   C   D   E   NaN NaN F   G
    3   4   B   C   D   E   NaN NaN NaN NaN
    4   5   B   C   D   E   NaN NaN NaN NaN

我只想用已经存在的列来填补缺少的空白。这种方法创建新列(f_x,g_x,f_y,g_y)

Append和contact也不起作用,因为它们重复信息(“a”上的重复行)。

关于如何解决这个问题有什么建议吗?将df1df2合并后,以及与df3合并后的最终结果应为:

        a   b   c   d   e   f   g
    0   1   B   C   D   E   F   G
    1   2   B   C   D   E   F   G
    2   3   B   C   D   E   F   G
    3   4   B   C   D   E   NaN NaN
    4   5   B   C   D   E   NaN NaN

最终,所有列都将在循环过程中填充,因此第一个添加的(df2)将添加新列,从df3开始,只添加新数据以填充所有NaN。循环如下所示:

df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
for num, item in enumerate(df1['a']):
    #compute df[num] (based on values on df1)
    df1 = pd.merge(df1, df[num],  how='left', left_on=['a'], right_on = ['a'])

共有3个答案

史钊
2023-03-14

在与df3的合并中,我只会使用df1的子集,或者我会保留原始df1的副本。

>

  • 子集:

    df1.fillna(pd.merge(df1.loc(1)['a':'e'], df3, how='left',
                        left_on=['a'], right_on = ['a']),
               inplace=True)
    

    原始数据的副本

    df1_orig = df1           # before merging with df2
    ...
    df1.fillna(pd.merge(df1_orig, df3, how='left',
                        left_on=['a'], right_on = ['a']),
               inplace=True)
    

  • 陆高峰
    2023-03-14

    另一种方法是使用fillna然后删除不再需要的额外列:

    # Fill NaN with the extra columns value
    df1.f_x.fillna(df1.f_y, inplace=True)
    df1.g_x.fillna(df1.g_y, inplace=True)
    
       a  b  c  d  e  f_x  g_x  f_y  g_y
    0  1  B  C  D  E    F    G  NaN  NaN
    1  2  B  C  D  E    F    G  NaN  NaN
    2  3  B  C  D  E    F    G    F    G
    3  4  B  C  D  E  NaN  NaN  NaN  NaN
    4  5  B  C  D  E  NaN  NaN  NaN  NaN
    
    # Slice of the last two columns
    df1 = df1.iloc[:, :-2]
    # Rename the columns correctly
    df1.columns = df1.columns.str.replace('_x', '')
    

    输出

       a  b  c  d  e    f    g
    0  1  B  C  D  E    F    G
    1  2  B  C  D  E    F    G
    2  3  B  C  D  E    F    G
    3  4  B  C  D  E  NaN  NaN
    4  5  B  C  D  E  NaN  NaN
    
    宿嘉
    2023-03-14

    一个可能的解决方案是conat所有小的DataFrames,然后只有一次合并

    df4 = pd.concat([df2, df3])
    print (df4)
       a  f  g
    0  1  F  G
    1  2  F  G
    0  3  F  G
    
    df1 = pd.merge(df1, df4,  how='left', on = 'a')
    print (df1)
       a  b  c  d  e    f    g
    0  1  B  C  D  E    F    G
    1  2  B  C  D  E    F    G
    2  3  B  C  D  E    F    G
    3  4  B  C  D  E  NaN  NaN
    4  5  B  C  D  E  NaN  NaN
    

    另一个可能的解决方案是使用DataFrame.combine_firstDataFrame.set_index

    df1 = (df1.set_index('a')
             .combine_first(df2.set_index('a'))
             .combine_first(df3.set_index('a')))
    print (df1)
       b  c  d  e    f    g
    a                      
    1  B  C  D  E    F    G
    2  B  C  D  E    F    G
    3  B  C  D  E    F    G
    4  B  C  D  E  NaN  NaN
    5  B  C  D  E  NaN  NaN
    
     类似资料:
    • 问题内容: 我有一个OHLC价格数据集,该数据集已从CSV解析为Pandas数据框,并重新采样为15分钟的柱形: 我想添加各种计算的列,从简单的列开始,例如期间范围(HL),然后是布尔值以指示我将定义的价格模式的出现-例如锤形蜡烛模式,为其定义示例: 基本问题:如何将函数映射到列,特别是在我想引用多个其他列或整行或其他内容的地方? 这篇文章处理从单个源列添加两个计算列,这是很接近的,但还不完全是。

    • 问题内容: 我有两个,都被索引。我需要将元素添加在一起以形成一个new ,但前提是索引和列相同。如果该项不存在于之一,则应将其视为零。 我试过使用,但这无论索引和列如何。还尝试了一个简单的方法,但是如果两个数据框都没有该元素,则给出a 。 有什么建议? 问题答案: 怎么样

    • 问题内容: 如果我有一个空的数据框: 有没有一种方法可以向此新创建的数据框添加新行?目前,我必须创建一个字典,将其填充,然后将字典附加到最后的数据框中。有没有更直接的方法? 问题答案: 即将发布的pandas 0.13版本将允许通过不存在的索引数据添加行。但是,请注意,这实际上会创建整个DataFrame的副本,因此这不是有效的操作。 说明在此处,此新功能称为“ 放大设置” 。

    • 我创建了一个名为的函数,该函数采用了如图所示的这3个参数,结果是新参数。我想将此函数应用于一个数据帧,其中函数参数是数据帧中的某些列,并希望将函数的输出参数添加为数据帧中的新参数,在数据帧中为每行计算函数。

    • 问题内容: 我尝试更新我的插件。因此,我必须升级mysql_table。但是当尝试新列时,程序会获得异常。 这是我当前的表格: 现在,我向colum添加多一张桌子。我尝试更改表,一次工作,并添加一列,但又刷新一次,我收到此错误。 这是我的代码 这是我的错误 WordPress数据库错误:[重复的列名’say_state’] ALTER TABLE wp_customer_say添加了say_sta

    • 问题内容: 我的数据可以在给定日期包含多个事件,也可以在一个日期包含否事件。我接受这些事件,按日期计数并绘制它们。但是,当我绘制它们时,我的两个系列并不总是匹配。 在上面的代码中,idx变为30个日期范围。2019/09/01至2019/09/30但是S可能只有25或26天,因为在给定日期没有事件发生。然后,当我尝试绘图时,由于大小不匹配,我得到一个AssertionError: 解决这个问题的正

    • 我正在使用Pandas,希望将行添加到已建立列的空数据框中。 到目前为止,我的代码看起来像这样。。。 然而,当我跑步的时候。。。 数据框返回时没有行,只有列。我不确定我做错了什么,但我很确定它与append方法有关。有人知道我做错了什么吗?

    • 问题内容: 这可能很容易,但是我有以下数据: 在数据框1中: 在数据框2中: 我想要一个具有以下形式的数据框: 我尝试使用该方法,但是得到了交叉连接(即笛卡尔积)。 什么是正确的方法? 问题答案: 通常看来,您只是在寻找联接: