pandas 合并2个 Dataframe ,并使用条件更新包含列表的列

u91tlkcl  于 2022-12-10  发布在  其他
关注(0)|答案(3)|浏览(153)

我有2个具有相同列和索引的 Dataframe 。

a              a

1 []             1 [5,2,7]

2 [1,2,3]        2 [1,2,3,4]

3 [7]            3 [7,5]

我想使用条件合并它们,当列表长度〈=1时,取值并将其添加到第一个 Dataframe ,否则保留旧值。
所以在那之后的结果是:

a             

1 [5,2,7]            

2 [1,2,3]

3 [7,5]

最好的方法是什么?

jucafojl

jucafojl1#

for i, (x,y) in enumerate(zip(dfa['a'], dfb['b'])):
    # apply your logic - 'when length of list is <=1 then take value...' and save it in dfa['a'][i]
    if len(x) <= 1:
        dfa.loc[i]['a'] = y
oiopk7p5

oiopk7p52#

下面是一种使用pandas.DataFrame.mask的方法。
首先,确保每个 Dataframe /列的值都是列表:

df1["a"]= df1["a"].str.strip("[]").str.split(",") #skip if already a list
df2["a"]= df2["a"].str.strip("[]").str.split(",") #skip if already a list

然后,使用pandas.Series.str.len

out = df1.mask(df1["a"].str.len().le(1), other=df2["a"], axis=0)

或者使用pandas.Series.transform

out = df1.mask(df1["a"].transform(len).le(1), other=df2["a"], axis=0)
#输出:
print(out)
           a
0  [5, 2, 7]
1  [1, 2, 3]
2     [7, 5]
hmmo2u0o

hmmo2u0o3#

您可以使用numpy.where()来评估条件并返回所需的版本。
在这个解决方案中,我将两个列表组合起来,然后转换成一个集合来删除重复项,然后再转换回一个列表,因为我相信这是您最后想要的。请注意,这确实会改变元素(您可以使用[2,5,7]代替[5,2,7]

new_df = np.where(
    df1['a'].apply(len)<=1,
    (df1['a'] + df2['a']).apply(set).apply(list),
    df1['a'])

相关问题