使用numpy遍历csv文件

0 投票
1 回答
66 浏览
提问于 2025-04-12 22:50

我有一个CSV文件,里面有4列数据,记录了轨道的x和y位置。第一列是轨道的ID,第二列是时间,第三和第四列分别是X和Y坐标。

现在,X和Y的位置会随着时间(第二列)从1变化到39。我写了一些函数(用for循环)来计算X和Y的均方位移(MSD),这个计算是基于时间(第二列)的。

不过,我想创建一个'for'循环,让代码能够识别ID(来自第一列),然后计算上述提到的X和Y的MSD,针对第一个轨道。接着再对第二个轨道(来自第一列)重复这个过程,依此类推。最后,把所有这些数据写入一个CSV文件。

这将是一个嵌套的for循环,对于第一列中的每个轨道ID,它都会计算MSD值。

希望这个问题描述清楚。

为了简化,我展示了ID#1和ID#2的数据。

[ID Time    X   Y
1   0   1601.335544 496.4608855
1   1   1581.838184 497.3440951
1   2   1574.051153 493.2139985
1   3   1559.965258 504.9056873
1   4   1559.163646 493.4245832
1   5   1552.987661 494.2848072
1   6   1548.432535 497.3584389
1   7   1538.938784 495.0417267
1   8   1531.85109  489.0665788
1   9   1513.806745 504.7704007
1   10  1510.326674 497.5994863
1   11  1504.674908 506.2031946
1   12  1501.314024 509.9807796
1   13  1486.108431 530.8405735
1   14  1478.028873 528.9872163
1   15  1461.280431 555.1810352
1   16  1457.827357 544.1238295
1   17  1438.153357 546.1896118
1   18  1432.669134 536.079993
1   19  1421.693967 539.1976368
1   20  1420.047558 531.8360775
1   21  1407.484016 552.6212932
1   22  1401.323039 542.387526
1   23  1392.214888 550.167287
1   24  1383.369105 538.1534221
1   25  1376.908441 563.2408666
1   26  1375.965296 552.1877753
1   27  1356.164381 565.6603602
1   28  1350.494881 554.3032903
1   29  1343.425562 554.2145022
1   30  1338.147555 543.5654733
1   31  1319.226209 549.3667058
1   32  1315.186512 544.1423621
1   33  1304.524207 559.4354187
1   34  1307.192095 545.9207145
1   35  1297.79372  555.0278485
1   36  1293.623393 548.495482
1   37  1272.472404 556.9643619
1   38  1267.257919 553.4317279
1   39  1256.48484  564.7547876
2   0   1938.04852  502.2096272
2   1   1910.274979 499.4121209
2   2   1905.602566 494.564121
2   3   1892.023117 500.8674278
2   4   1890.41268  497.2568435
2   5   1889.370728 497.1678774
2   6   1879.222251 493.4259324
2   7   1854.213543 505.9090132
2   8   1849.009713 506.4718795
2   9   1827.907196 521.1249766
2   10  1825.557874 513.5055768
2   11  1811.655479 514.9185746
2   12  1804.375201 506.0495205
2   13  1790.033474 520.9751489
2   14  1782.406459 512.8187715
2   15  1768.6465   528.522878
2   16  1767.990804 526.0058206
2   17  1761.603106 535.8145984
2   18  1753.677501 517.6532347
2   19  1747.538543 539.0509296
2   20  1746.84304  531.1623969
2   21  1742.643159 543.8348459
2   22  1736.949154 534.7801535
2   23  1729.319064 542.8045771
2   24  1724.696825 533.3967561
2   25  1704.024318 549.7868714
2   26  1692.312454 544.4582317
2   27  1686.267143 547.7829218
2   28  1673.865039 545.091512
2   29  1662.986818 562.5577513
2   30  1656.270704 562.4002987
2   31  1642.961381 568.3286907
2   32  1643.388565 563.512262
2   33  1631.965059 570.7782627
2   34  1634.874901 563.7563826
2   35  1622.105795 574.0527937
2   36  1616.78351  569.5772635
2   37  1611.596229 576.4976228
2   38  1608.866078 567.6358896
2   39  1591.533636 576.2326799]

这是我用来计算X和Y的MSD的for循环。

def calc_msd_np(x):
    msd = []
    for s in range(1,len(x)):
        dx = x[s:] - x[:-s]
        msd.append(np.average(dx**2))
    return msd
print(calc_msd_np(x))

类似地,我也用for循环来处理Y坐标。基本上,这个X和Y的MSD需要针对每个ID进行迭代。

我对这些内容还很陌生,所以弄清楚嵌套循环对我来说非常具有挑战性。

1 个回答

0

首先,把你的csv文件转换成pandas格式。

df = pd.read_csv("yourcsv")

接下来,创建一个新的列,叫做MSD,并为这个MSD列定义一个公式。

df["MSD"] = #MSD formula

删除x和y这两列,只保留id、time和MSD这三列。

new_df=df.drop(columns=["x","y"],axis=1)

最后,把你的pandas数据再转换回csv格式。

new_df.to_csv("final.csv")

撰写回答