繁体   English   中英

使用 pd.concat() 和 python 从“for循环”追加行

[英]append rows using pd.concat() with python from a 'for loop'

更新后,我收到以下消息:

'frame.append 方法已弃用,将在未来版本中从 pandas 中删除。 请改用 pandas.concat。

我正在进行一个人造星实验,其中我有三个带有列的文件:

b1: ['Id', 'x', 'y', 'bmag'] - 带有 b 过滤器的人造星

i1: ['Id', 'x', 'y', 'imag'] - 带有 I-filter 的人造星

biart: ['Id', 'x', 'y', 'bmag', 'imag'] - 测量的星星

**我已经计算了 b1(人造)和 biart(测量)中恒星之间的最小径向距离,如果满足最小距离,则使用“Id”、“bmag”和“imag”编写数据帧。 **

代码遍历 b1 的每一行并确定 biart 的哪一行具有最小距离,然后将其保存在数据帧中

我无法用pd.concat()而不是df.append()重写我的代码。 请帮忙!

extract = pd.DataFrame(columns=['Id_art', 'x_art', 'y_art', 
                                'bmag_art', 'imag_art', 
                                'dist_d',
                                'Id_meas', 'x_meas', 'y_meas',                                 
                                'bmag_meas', 'imag_meas'])

for i in range(len(b1.index)):
    
    x = b1['x'].iloc[i]
    y = b1['y'].iloc[i]
    
    dist = np.sqrt((x - biart['x'])**2 + (y - biart['y'])**2)
    
    if (min(dist))<=1/2:
            
        extract = extract.append({'Id_art': b1['Id'].iloc[i],
                                    'x_art':b1['x'].iloc[i], 
                                   'y_art': b1['y'].iloc[i], 
                                 'bmag_art':b1['bmag'].iloc[i],
                                 'imag_art':i1['imag'].iloc[i],
                                      'dist_d':min(dist), 
                            'Id_meas':biart['Id'].iloc[dist.idxmin()], 
                             'x_meas':biart['x'].iloc[dist.idxmin()],
                             'y_meas':biart['y'].iloc[dist.idxmin()], 
                          'bmag_meas':biart['bmag'].iloc[dist.idxmin()],
                          'imag_meas':biart['imag'].iloc[dist.idxmin()]},
                                     ignore_index=True)

我是 python 新手。 你能帮忙解释一下如何将下面的代码重写为 pd.concat() 吗?

extract.append({'Id_art': b1['Id'].iloc[i],
                  'x_art':b1['x'].iloc[i], 
                 'y_art': b1['y'].iloc[i], 
               'bmag_art':b1['bmag'].iloc[i],
               'imag_art':i1['imag'].iloc[i],
                 'dist_d':min(dist), 
                'Id_meas':biart['Id'].iloc[dist.idxmin()], 
                 'x_meas':biart['x'].iloc[dist.idxmin()],
                 'y_meas':biart['y'].iloc[dist.idxmin()], 
              'bmag_meas':biart['bmag'].iloc[dist.idxmin()],
              'imag_meas':biart['imag'].iloc[dist.idxmin()]},
                                    ignore_index=True)

请看下面三个数据文件的前 30 个值:

b1:
    Id       x         y      bmag    z1  z2  z3  z4  z5
      1    1163.630 1327.069  16.4552   0   0   0   0   0
      2    1747.045 1477.734  16.1293   0   0   0   0   0
      3    3236.084 1252.050  16.5628   0   0   0   0   0
      4    2516.600  888.832  17.7005   0   0   0   0   0
      5    1868.000 1376.218  16.3139   0   0   0   0   0
      6    2484.642  941.331  16.7632   0   0   0   0   0
      7    2984.336  640.185  16.1351   0   0   0   0   0
      8    2612.480 1664.341  16.3573   0   0   0   0   0
      9    1973.405  731.071  18.7704   0   0   0   0   0
     10    3391.978  130.435  16.1769   0   0   0   0   0
     11     165.021  942.634  17.4829   0   0   0   0   0
     12    2491.430 1397.675  16.5589   0   0   0   0   0
     13    2886.291 1367.745  16.3339   0   0   0   0   0
     14     939.302  726.039  16.8744   0   0   0   0   0
     15    2296.265  686.110  16.1132   0   0   0   0   0
     16     682.263  932.721  16.5750   0   0   0   0   0
     17    2393.509 1776.220  16.8953   0   0   0   0   0
     18     277.072 1879.963  16.1769   0   0   0   0   0
     19    1824.305 1616.309  16.2134   0   0   0   0   0
     20    2986.818  833.414  16.2364   0   0   0   0   0
     21    2547.293 1067.399  16.4345   0   0   0   0   0
     22     707.099  591.125  16.1352   0   0   0   0   0
     23    1987.175  899.605  17.0269   0   0   0   0   0
     24    2853.484  761.114  16.4994   0   0   0   0   0
     25    2664.596  897.447  16.7100   0   0   0   0   0
     26     730.565  905.192  18.1313   0   0   0   0   0
     27    2760.565 1894.611  17.9226   0   0   0   0   0
     28    3427.851 1883.343  18.2891   0   0   0   0   0
     29    2165.442  769.363  17.9948   0   0   0   0   0
     30    2982.916 1094.855  17.1777   0   0   0   0   0
i1:
     Id       x         y      imag    z1  z2  z3  z4  z5
      1    1168.121 1332.597  15.1104   0   0   0   0   0
      2    1751.536 1483.263  14.3248   0   0   0   0   0
      3    3240.575 1257.578  15.3140   0   0   0   0   0
      4    2521.091  894.360  17.1246   0   0   0   0   0
      5    1872.491 1381.746  14.8184   0   0   0   0   0
      6    2489.133  946.859  15.6679   0   0   0   0   0
      7    2988.827  645.714  14.3458   0   0   0   0   0
      8    2616.971 1669.869  14.9122   0   0   0   0   0
      9    1977.896  736.599  18.6215   0   0   0   0   0
     10    3396.469  135.964  14.4787   0   0   0   0   0
     11     169.512  948.163  16.8041   0   0   0   0   0
     12    2495.921 1403.203  15.3067   0   0   0   0   0
     13    2890.782 1373.273  14.8621   0   0   0   0   0
     14     943.793  731.567  15.8544   0   0   0   0   0
     15    2300.756  691.638  14.2601   0   0   0   0   0
     16     686.754  938.249  15.3363   0   0   0   0   0
     17    2398.000 1781.748  15.8890   0   0   0   0   0
     18     281.563 1885.491  14.4787   0   0   0   0   0
     19    1828.796 1621.837  14.5791   0   0   0   0   0
     20    2991.309  838.942  14.6377   0   0   0   0   0
     21    2551.784 1072.927  15.0697   0   0   0   0   0
     22     711.590  596.653  14.3461   0   0   0   0   0
     23    1991.666  905.133  16.1022   0   0   0   0   0
     24    2857.975  766.643  15.1955   0   0   0   0   0
     25    2669.087  902.975  15.5765   0   0   0   0   0
     26     735.056  910.720  17.7406   0   0   0   0   0
     27    2765.056 1900.140  17.4449   0   0   0   0   0
     28    3432.342 1888.871  17.9612   0   0   0   0   0
     29    2169.933  774.891  17.5477   0   0   0   0   0
     30    2987.407 1100.383  16.3397   0   0   0   0   0
biart:
     Id      x       y      bmag         imag      
      1    3.463   964.699  16.0450     16.9640   
      2    5.084  1567.960  16.9260     18.4700   
      3    5.105   236.018  15.0720     16.1090   
      4    5.236   364.229  17.4830     15.8440   
      5    5.478  1434.603  17.3220     16.7400   
      6    5.564   453.920  16.9000     17.2100   
      7    6.015  1186.374  17.9310     15.5080   
      8    6.017   945.186  17.5790     17.2270   
      9    6.031  1001.720  15.4920     16.7710   
     10    6.337   747.211  16.0480     14.9890   
     11    6.376  1243.525  15.8780     14.8180   
     12    6.426   635.425  17.3890     17.2010   
     13    6.432    72.437  16.3430     16.7180   
     14    6.584   982.933  17.7750     17.9360   
     15    6.630   688.179  16.8100     17.2390   
     16    6.827  1559.448  17.6680     17.1000   
     17    6.855   502.682  18.0290     17.4950   
     18    7.260  1807.838  17.8060     17.3680   
     19    7.289   981.327  18.3170     17.6140   
     20    7.383  1485.190  16.4730     14.4650   
     21    7.461  1141.420  16.3860     15.6110   
     22    7.696  1213.424  15.9370     14.7050   
     23    7.779  1211.424  16.9000     15.2840   
     24    7.853   821.390  15.1270     16.2590   
     25    7.868  1325.808  18.3270     17.9500   
     26    7.954  1789.587  16.2340     14.7330   
     27    8.132   194.533  17.1350     16.5100   
     28    8.194  1390.519  16.3770     15.4670   
     29    8.555   299.428  17.7980     16.5920   
     30    8.724   982.512  17.9880     17.1510   

提取输出

您可以从单行生成每个数据帧,然后连接所有行,而不是将行添加到数据框中。

尽管它可能令人惊讶,但它更有效。

list_a = []

对于我在范围内(len(b1.index)):

x = b1['x'].iloc[i]
y = b1['y'].iloc[i]

dist = np.sqrt((x - biart['x'])**2 + (y - biart['y'])**2)

if (min(dist))<=1/2:
        
    list_a.append(pd.DataFrame({'Id_art': b1['Id'].iloc[i],
             'x_art':b1['x'].iloc[i], 
             'y_art': b1['y'].iloc[i], 
             'bmag_art':b1['bmag'].iloc[i],
             'imag_art':i1['imag'].iloc[i],
             'dist_d':min(dist), 
             'Id_meas':biart['Id'].iloc[dist.idxmin()], 
             'x_meas':biart['x'].iloc[dist.idxmin()],
             'y_meas':biart['y'].iloc[dist.idxmin()], 
             'bmag_meas':biart['bmag'].iloc[dist.idxmin()],
             'imag_meas':biart['imag'].iloc[dist.idxmin()]},
             index=[0])``

现在连接。

df_all = pd.concat(list_a, ignore_index=True)

并删除中间列表

del list_a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM