【问题标题】:Replace rows in a Pandas df with rows from another df of different size用来自另一个不同大小的 df 的行替换 Pandas df 中的行
【发布时间】:2018-09-07 11:25:18
【问题描述】:

我有 2 个 Pandas dfs,A 和 B,有一些匹配的列,但行数不同。 我想根据某些条件将匹配列的值从 B 复制到 A。我试过这个:

s1 = pd.Series([5, 1, 'a'])
s2 = pd.Series([6, 2, 'b'])
s3 = pd.Series([7, 3, 'd'])
s4 = pd.Series([8, 4, 'e'])
s5 = pd.Series([9, 5, 'f'])

df1 = pd.DataFrame([list(s1), list(s2),list(s3),list(s4),list(s5)],  columns =  ["A", "B", "C"])

s1 = pd.Series([5, 6, 'p'])
s2 = pd.Series([6, 7, 'q'])
s3 = pd.Series([7, 8, 'r'])
s4 = pd.Series([8, 9, 's'])
s5 = pd.Series([9, 10, 't'])

df2 = pd.DataFrame([list(s1), list(s2),list(s3),list(s4),list(s5)],  columns =  ["A", "B", "C"])

df1.loc[df1.A.isin(df2.A), ['B', 'C']] = df2[['B', 'C']]
print (df1)
   A   B  C
0  5   6  p
1  6   7  q
2  7   8  r
3  8   9  s
4  9  10  t

这在行数相同时有效,但如果 B 的行数较少,则索引未对齐,我在最终的 df 中得到 NaN。例如,df2 的行数少了,行索引没有对齐

df2 = pd.DataFrame([list(s1), list(s2),list(s4),list(s5)],  columns =  ["A", "B", "C"])

df1.loc[df1.A.isin(df2.A), ['B', 'C']] = df2[['B', 'C']]

print (df1)
       A     B    C
    0  5   6.0    p
    1  6   7.0    q
    2  7   8.0    r
    3  8  10.0    t
    4  9   NaN  NaN

如果 A 列中的值相同,如何执行此操作并复制该值?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您似乎在寻找pd.update 帮助示例,

    df = pd.DataFrame({'A': [1, 2, 3],
                    'B': [400, 500, 600]})
    new_df = pd.DataFrame({'B': [4, np.nan, 6]})
    df.update(new_df)
    
    df
    

    结果

       A      B
    0  1    4.0
    1  2  500.0
    2  3    6.0
    

    帮助示例,但请注意索引很重要。您使用的是初始值顺序的默认索引,但如果您要从具有不同长度的数据框中更新值,则要更新哪些行可能很重要。

    【讨论】:

      【解决方案2】:

      我发现解决这个问题的唯一方法如下:

      df = df1.merge(df2, how='left', left_on='A', right_on = 'A')
      
      def select(row, field):
          if row['{}_y'.format(field)] is np.nan:
              return row['{}_x'.format(field)]
          else:
              return row['{}_y'.format(field)]
      
      df['C'] = df[['C_x', 'C_y']].apply(select, field='C', axis=1)
      df['B'] = df[['B_x', 'B_y']].apply(select, field='B', axis=1)
      

      看似迂回,但想不出更好的解决方案。

      【讨论】:

        猜你喜欢
        • 2018-04-04
        • 1970-01-01
        • 2023-01-14
        • 2019-12-22
        • 2017-04-22
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        相关资源
        最近更新 更多