pandas 使用另一个数据框更新数据框中的数组字段

wribegjk  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(92)

我有一个 Dataframe ,看起来像这样:
| 识别号|可乐|列B|
| - ------|- ------|- ------|
| 项目a|xx|[四、七]|
| B|x|[2、9]|
| (c)秘书长的报告|某某|[5、0]|
另一个dataframe:
| 识别号|可乐|冷D|
| - ------|- ------|- ------|
| B|x|六个|
| 日|x|十四|
| (c)秘书长的报告|某某|五十四|
我想通过添加第二个df中colD的值来更新第一个df,因此结果应该是:
| 识别号|可乐|列B|
| - ------|- ------|- ------|
| 项目a|xx|[四、七]|
| B|x|[2、9、6]|
| (c)秘书长的报告|某某|[5、0、54]|
ID列是索引。你知道有没有一种不使用循环的快速方法吗?我使用了一个循环,但它花了太多时间,因为df包含超过50000行。

puruo6ea

puruo6ea1#

import pandas as pd

df1 = pd.DataFrame({'ID': ["a", "b", "c"], 
                   'ColA': ["xx", "x", "xxx"], 
                   'ColB': [[4, 7], [2, 9], [5, 0]], 
                   })

df2 = pd.DataFrame({'ID': ["b", "d", "c"], 
                   'ColA': ["x", "x", "xxx"], 
                   'ColB': [6, 14, 54], 
                   })

def union(d):
    vals = df1.loc[d.index][['ID', 'ColB']].values[0].tolist()
    b = df2.loc[df2['ID'].eq(vals[0])]['ColB'].values.tolist()
    return vals[1] + b

r = ( df1.groupby(['ID', 'ColA'])
         .agg({'ColB': lambda d: union(d)}) 
      ).reset_index()

print(r)
ID ColA        ColB
0  a   xx      [4, 7]
1  b    x   [2, 9, 6]
2  c  xxx  [5, 0, 54]
sr4lhrrt

sr4lhrrt2#

您希望合并,然后将这些列表合并到一个新列中,并删除其他列表。
例如:

df = df1.merge(df2, on = 'ID')
df['combo_list'] = df[['colB','colD'].values.tolist()
df.drop(columns = ['colB', 'colD'], inplace = True)

相关问题