使用numpy遍历csv文件
我有一个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")