我需要用另一个DataFrame中的值替换Pandas DataFrame中缺少的值。
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']})
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
df2 = pd.DataFrame({'ID':['3333','5555'], 'Test':['T1','T2'], 'Label': ['OOT-P', 'OOT-T']})
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列。
发布于 2021-10-30 03:40:50
您可以在df1
中将df2
as系列重塑为fillna
。
需要做几件事:用实际的浮点型NaN
替换字符串'NaN'
,临时将ID/Test设置为索引,并临时转置数据帧(带有系列/字典的fillna
仅适用于列)
(df1.replace('NaN', float('nan'))
.set_index(['ID','Test']).T
.fillna(df2.set_index(['ID','Test'])['Label'])
.T.reset_index()
)
输出:
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
发布于 2021-10-30 04:30:37
您还可以创建一个元组列表,其中包含要更改的ID和要将其更改为的值。然后,您可以简单地迭代ID并将NaN值替换为您的新值。
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]
输出:
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
https://stackoverflow.com/questions/69776237
复制相似问题