python - 如果值匹配,则通过 DataFrame 设置 pandas DataFrame 的子集

标签 python pandas dataframe

我认为解释我想要做的事情的最简单方法是展示一个示例:

给定一个数据框

        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 中的值。

这里有一个使用 mapfillna 的解决方案,如果您的 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/

相关文章:

python - 就地构建 python 扩展并一次性安装

python - 如何从一个文件中提取多个 JSON 对象?

python - 使用 Pandas Python 进行透视以获取 bool 值

python - 在连字符后跟数字之前使用正则表达式提取字符串的一部分

python - 将字符串日期时间转换为 Pandas 日期时间

python - 有效地将具有混合文本值和 None 的列转换为整数列表

python - 计算 DataFrame 中各组的差异和均值

python - brew 安装Python/matplotlib不工作: No module named _tkinter

python - 如何使用if语句为python中的新列赋值?

r - 其他两列之间的唯一值列