首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据另一个Pandas DataFrame中的值替换Pandas DataFrame中缺少的值

根据另一个Pandas DataFrame中的值替换Pandas DataFrame中缺少的值
EN

Stack Overflow用户
提问于 2021-10-30 01:51:37
回答 2查看 73关注 0票数 1

我需要用另一个DataFrame中的值替换Pandas DataFrame中缺少的值。

代码语言:javascript
运行
复制
df1 = pd.DataFrame({'ID':['1111','2222','3333','4444','5555'],'Test':['T1','T1','T1','T2','T2'], 'Day1': ['P','P','P','P','P'], 'Day2': ['P','P','P','P', 'NaN'], 'Day3':['P','P','NaN','P','NaN'], 'Day4': ['P','P','NaN','P','NaN']})
代码语言:javascript
运行
复制
    ID   Test Day1 Day2 Day3 Day4
0   1111 T1   P    P    P    P
1   2222 T1   P    P    P    P
2   3333 T1   P    P    NaN  NaN
3   4444 T2   P    P    P    P
4   5555 T2   P    NaN  NaN  NaN
代码语言:javascript
运行
复制
df2 = pd.DataFrame({'ID':['3333','5555'], 'Test':['T1','T2'], 'Label': ['OOT-P', 'OOT-T']})
代码语言:javascript
运行
复制
    ID   Test Label
0   3333 T1   OOT-P
1   5555 T2   OOT-T

用于Day3的NaN和用于ID=3333的Day4以及df1中的test=T1需要替换为df2的OOT-P。

用于Day2的NaN、用于Day3的Day4、用于ID=5555的Day4和test=T2在df1中需要替换为df2的OOT-T。

两个数据帧都将始终具有ID和测试列,但是df1中的附加列的名称和数量将发生变化。例如,df1可以具有Day1、Day2、Day3、Day4、Day5列或Week1、Week2、Week3列。

EN

回答 2

Stack Overflow用户

发布于 2021-10-30 03:40:50

您可以在df1中将df2 as系列重塑为fillna

需要做几件事:用实际的浮点型NaN替换字符串'NaN',临时将ID/Test设置为索引,并临时转置数据帧(带有系列/字典的fillna仅适用于列)

代码语言:javascript
运行
复制
(df1.replace('NaN', float('nan'))
    .set_index(['ID','Test']).T
    .fillna(df2.set_index(['ID','Test'])['Label'])
    .T.reset_index()
 )

输出:

代码语言:javascript
运行
复制
     ID Test Day1   Day2   Day3   Day4
0  1111   T1    P      P      P      P
1  2222   T1    P      P      P      P
2  3333   T1    P      P  OOT-P  OOT-P
3  4444   T2    P      P      P      P
4  5555   T2    P  OOT-T  OOT-T  OOT-T
票数 2
EN

Stack Overflow用户

发布于 2021-10-30 04:30:37

您还可以创建一个元组列表,其中包含要更改的ID和要将其更改为的值。然后,您可以简单地迭代ID并将NaN值替换为您的新值。

代码语言:javascript
运行
复制
IDS_to_Change = df2.ID.values.tolist()

New_Vals = []
for i in range(len(df2.index)):
    New_Vals.append(df2[df2['ID'] == IDS_to_Change[i]].Label[i])

Data_to_Merge = list(zip(IDS_to_Change, New_Vals))

for ids in Data_to_Merge:
    for i in range (len(df1.index)):
        if df1['ID'][i] == ids[0]:
            id_name = ids[0]          
            index = df1[df1['ID'] == id_name].index[0]
            for j in range(len(df1[df1['ID'] == id_name].columns)):
                 if df1[df1['ID'] == id_name].loc[index][j] == 'NaN':
                    df1.iloc[index][j] = ids[1]

输出:

代码语言:javascript
运行
复制
    ID    Test  Day1    Day2    Day3    Day4
0   1111    T1     P       P       P       P
1   2222    T1     P       P       P       P
2   3333    T1     P       P   OOT-P   OOT-P
3   4444    T2     P       P       P       P
4   5555    T2     P   OOT-T   OOT-T   OOT-T
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69776237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档