我认为解释我想要做的事情的最简单方法是展示一个示例:
给定一个数据框
V_set V_reset I_set I_reset HRS LRS ID
0 0.599417 -0.658417 0.000021 -0.000606 84562.252849 1097.226787 1383.0
1 0.595250 -0.684708 0.000023 -0.000617 43234.544776 1144.445368 1384.0
2 0.621229 -0.710812 0.000026 -0.000625 51719.718749 1216.609759 1385.0
3 0.625292 -0.720104 0.000029 -0.000625 40827.993527 1209.966052 1386.0
4 0.634563 -0.735937 0.000029 -0.000641 46881.785573 1219.497465 1387.0
... ... ... ... ... ... ...
1066 0.167521 0.000000 0.000581 0.000000 720.116614 708.098519 2811.0
1067 0.167360 0.000000 0.000581 0.000000 718.165882 708.284487 2812.0
1068 0.172812 0.000000 0.000278 0.000000 715.302620 708.167571 2813.0
1069 0.167729 0.000000 0.000581 0.000000 716.096291 708.333064 2814.0
1070 0.173037 0.000000 0.000278 0.000000 715.474310 707.980273 2815.0
和第二个DataFrame的子集df.loc[(df['HRS'].isnull()) & (df['wfm']=='shr'), ['HRS',' LRS','V_set','V_reset','I_set','I_reset','ID']]
:
V_set V_reset I_set I_reset HRS LRS ID
1383 NaN NaN NaN NaN NaN NaN 1383.0
1384 NaN NaN NaN NaN NaN NaN 1384.0
1385 NaN NaN NaN NaN NaN NaN 1385.0
1386 NaN NaN NaN NaN NaN NaN 1386.0
1387 NaN NaN NaN NaN NaN NaN 1387.0
... ... ... ... ... ... ...
2811 NaN NaN NaN NaN NaN NaN 2811.0
2812 NaN NaN NaN NaN NaN NaN 2812.0
2813 NaN NaN NaN NaN NaN NaN 2813.0
2814 NaN NaN NaN NaN NaN NaN 2814.0
2815 NaN NaN NaN NaN NaN NaN 2815.0
我想用第一个 DataFrame 替换第二个 DataFrame 中的 NaN,但是 在 ID 匹配的位置,因为我不确定所选数据是否始终处于相同的顺序或是否包含所有 ID。
我知道我可以用 for 和 if 循环来做到这一点,但我想知道是否有更快的方法。 如果第二个 DataFrame 的 ID 未包含在第一个 DataFrame 中,则值应保留为 NaN。
非常感谢任何帮助。
最佳答案
IIUC,
您有常见的列名称,并且希望将 NaN 值替换为第一个 df 中的值。
这里有一个使用 map
和 fillna
的解决方案,如果您的 ID 具有 1 对 1 的关系,则该解决方案将起作用。
df.set_index('ID',inplace=True)
for column in df.columns:
df2[column] = df2[column].fillna(df2['ID'].map(df[column]))
<小时/>
print(df2)
V_set V_reset I_set I_reset HRS LRS \
1383 0.599417 -0.658417 0.000021 -0.000606 84562.252849 1097.226787
1384 0.595250 -0.684708 0.000023 -0.000617 43234.544776 1144.445368
1385 0.621229 -0.710812 0.000026 -0.000625 51719.718749 1216.609759
1386 0.625292 -0.720104 0.000029 -0.000625 40827.993527 1209.966052
1387 0.634563 -0.735937 0.000029 -0.000641 46881.785573 1219.497465
... ... ... ... ... ... ...
2811 0.167521 0.000000 0.000581 0.000000 720.116614 708.098519
2812 0.167360 0.000000 0.000581 0.000000 718.165882 708.284487
2813 0.172812 0.000000 0.000278 0.000000 715.302620 708.167571
2814 0.167729 0.000000 0.000581 0.000000 716.096291 708.333064
2815 0.173037 0.000000 0.000278 0.000000 715.474310 707.980273
ID
1383 1383.0
1384 1384.0
1385 1385.0
1386 1386.0
1387 1387.0
... NaN
2811 2811.0
2812 2812.0
2813 2813.0
2814 2814.0
2815 2815.0
如果您想填充整个数据帧并且您的键是唯一的 - 您可以将两个 ID 设置为索引并使用 .fillna
df2.set_index('ID').fillna(df.set_index('ID'))
print(df2)
V_set V_reset I_set I_reset HRS LRS
ID
1383.0 0.599417 -0.658417 0.000021 -0.000606 84562.252849 1097.226787
1384.0 0.595250 -0.684708 0.000023 -0.000617 43234.544776 1144.445368
1385.0 0.621229 -0.710812 0.000026 -0.000625 51719.718749 1216.609759
1386.0 0.625292 -0.720104 0.000029 -0.000625 40827.993527 1209.966052
1387.0 0.634563 -0.735937 0.000029 -0.000641 46881.785573 1219.497465
NaN ... ... ... ... ... ...
2811.0 0.167521 0.000000 0.000581 0.000000 720.116614 708.098519
2812.0 0.167360 0.000000 0.000581 0.000000 718.165882 708.284487
2813.0 0.172812 0.000000 0.000278 0.000000 715.302620 708.167571
2814.0 0.167729 0.000000 0.000581 0.000000 716.096291 708.333064
2815.0 0.173037 0.000000 0.000278 0.000000 715.474310 707.980273
关于python - 如果值匹配,则通过 DataFrame 设置 pandas DataFrame 的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786133/