基于相互列替换/填充来自另一个数据帧(不同索引)的数据帧(已筛选)子集中的值

2024-09-27 00:14:28 发布

您现在位置:Python中文网/ 问答频道 /正文

很难找出如何用另一个dataframe中的值替换主dataframe的过滤(在本例中为空)值,其中我在它们之间有相同的列/键。

这就是我所拥有的:

我需要填充空白马铃薯值的主数据框:

    date        banana      potato  avocado
33  2017-06-01  55ee4cbc    80660   b57c-2473556952a8
34  2017-06-01  391dc0f6            82ff-46de03510afc
35  2017-06-01  3a1f407f    54408   a3a6-d85429eef303
36  2017-06-01  3a1f407f    54408   858d-48082acc66ed
37  2017-06-01  5222ab45    80693   ba1f-dbd387748b71
38  2017-06-01  5222ab45    80693   b085-99d58875084a
39  2017-06-01  5222ab45    80693   a570-6d4c766ff7cf
40  2017-06-01  6939ced3            960c-a9ded8ed2f56
41  2017-06-01  2478913a    80610   9258-df6d26027d18
42  2017-06-01  2478913a    80610   8e53-a1d8d4e175b9
43  2017-06-01  2478913a    80610   b4b2-a9221895f8b5

根据匹配的banana值,香蕉土豆匹配了主df中的空格(对马铃薯指数0和3感兴趣):

^{pr2}$

希望以这样的结局: 通过保留相同的索引,或者重置索引以包含来自主数据帧的所有值

    date        banana      potato  avocado
33  2017-06-01  55ee4cbc    80660   b57c-2473556952a8
34  2017-06-01  391dc0f6    80686   82ff-46de03510afc
35  2017-06-01  3a1f407f    54408   a3a6-d85429eef303
36  2017-06-01  3a1f407f    54408   858d-48082acc66ed
37  2017-06-01  5222ab45    80693   ba1f-dbd387748b71
38  2017-06-01  5222ab45    80693   b085-99d58875084a
39  2017-06-01  5222ab45    80693   a570-6d4c766ff7cf
40  2017-06-01  6939ced3    55031   960c-a9ded8ed2f56
41  2017-06-01  2478913a    80610   9258-df6d26027d18
42  2017-06-01  2478913a    80610   8e53-a1d8d4e175b9
43  2017-06-01  2478913a    80610   b4b2-a9221895f8b5

我尝试过的

如果我合并它,那么我会得到一个新的框架,我不知道如何分配回原来的框架

pd.merge(linear_df[linear_df.potato== ''], banana_potato_matched_df, how='left', on='banana')

    date        banana      potato_x    potato_y    avocado
0   2017-06-01  55ee4cbc                NaN         b57c-2473556952a8
1   2017-06-01  391dc0f6                80686       82ff-46de03510afc
2   2017-06-01  3a1f407f                NaN         a3a6-d85429eef303
3   2017-06-01  3a1f407f                NaN         858d-48082acc66ed
4   2017-06-01  5222ab45                NaN         ba1f-dbd387748b71
5   2017-06-01  5222ab45                NaN         b085-99d58875084a
6   2017-06-01  5222ab45                NaN         a570-6d4c766ff7cf
7   2017-06-01  6939ced3                55031       960c-a9ded8ed2f56
8   2017-06-01  2478913a                80610       9258-df6d26027d18
9   2017-06-01  2478913a                80610       8e53-a1d8d4e175b9
10  2017-06-01  2478913a                80610       b4b2-a9221895f8b5

Other way I think of is to split my main_df to 2 dataframes. One with blank values (blank_main_df) and another with filled values (filled_main_df). To merge blank_main_df with banana_potato_matched_df on banana key and append to filled_main_df. Is that the best way ?


Tags: dfdatemainnanpotatobananaavocadoa3a6
2条回答

不需要合并,您只需将banana_potato_matched_df转换为dict,然后在df中将map的值转换为potato。i、 e

banana_dict = dict(zip(banana_potato_matched_df.banana, banana_potato_matched_df.potato))

香蕉糖:

^{pr2}$

映射值

df.loc[df.potato == '','potato'] = df.loc[df.potato == '','banana'].map(banana_dict)

输出:

          date    banana potato            avocado
0                                                 
33  2017-06-01  55ee4cbc  80660  b57c-2473556952a8
34  2017-06-01  391dc0f6  80686  82ff-46de03510afc
35  2017-06-01  3a1f407f  54408  a3a6-d85429eef303
36  2017-06-01  3a1f407f  54408  858d-48082acc66ed
37  2017-06-01  5222ab45  80693  ba1f-dbd387748b71
38  2017-06-01  5222ab45  80693  b085-99d58875084a
39  2017-06-01  5222ab45  80693  a570-6d4c766ff7cf
40  2017-06-01  6939ced3  55031  960c-a9ded8ed2f56
41  2017-06-01  2478913a  80610  9258-df6d26027d18
42  2017-06-01  2478913a  80610  8e53-a1d8d4e175b9
43  2017-06-01  2478913a  80610  b4b2-a9221895f8b5

希望有帮助

这样怎么样?在

首先创建一个值为空的数据帧:

combo = pd.merge(df[pd.isnull(df.potato)], subdf, how='left', on='banana', suffixes=('_',''))

那么,让我们去掉多余的列:

^{pr2}$

最后,让我们将数据帧与原始帧连接起来:

pd.concat([df[pd.notnull(df.potato)], combo], axis=0)

可能有一种方法可以使用fillna来实现这一点,但我现在无法找到解决方案。如果我想的话,我会编辑的。在

相关问题 更多 >

    热门问题