将Pandas df中的行替换为其他大小不同的df中的行

时间:2018-08-25 07:59:36

标签: pandas

我有2个Pandas df,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列中的值相同,该怎么做并复制该值?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

headers.add("Content-Disposition", "inline; filename=" + "example.pdf");

似乎是回旋处,但想不出更好的解决方案。