gpt4 book ai didi

python - 在Python中分析列的高度差并选择最大差值

转载 作者:行者123 更新时间:2023-12-01 00:35:53 26 4
gpt4 key购买 nike

我有一个 .csv 文件,其中包含样线 ( .csv file here ) 的 x y 数据。该文件可以包含几十个样线(仅示例 4 个)。

我想计算每个横断面的高程变化,然后选择高程变化最大的横断面。

x         y      lines
0 3.444 1
0.009 3.445 1
0.180 3.449 1
0.027 3.449 1
...
0 2.115 2
0.008 2.115 2
0.017 2.115 2
0.027 2.116 2

我尝试使用 pandas.dataframe.diff 计算变化,但无法从中选择最高的海拔变化。

更新:我找到了一种计算 1 条样线的高度差的方法。现在的目标是使该脚本循环遍历其他不同的样线,并让它选择差异最大的样线。不知道如何从此创建循环...

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import savgol_filter, find_peaks, find_peaks_cwt
from pandas import read_csv
import csv

df = pd.read_csv('transect4.csv', delimiter=',', header=None, names=['x', 'y', 'lines'])
df_1 = df ['lines'] == 1
df1 = df[df_1]

plt.plot(df1['x'], df1['y'], label='Original Topography')

#apply a Savitzky-Golay filter
smooth = savgol_filter(df1.y.values, window_length = 351, polyorder = 5)

#find the maximums
peaks_idx_max, _ = find_peaks(smooth, prominence = 0.01)

#reciprocal, so mins will become max
smooth_rec = 1/smooth

#find the mins now
peaks_idx_mins, _ = find_peaks(smooth_rec, prominence = 0.01)

plt.xlabel('Distance')
plt.ylabel('Height')

plt.plot(df1['x'], smooth, label='Smoothed Topography')

#plot them
plt.scatter(df1.x.values[peaks_idx_max], smooth[peaks_idx_max], s = 55,
c = 'green', label = 'Local Max Cusp')
plt.scatter(df1.x.values[peaks_idx_mins], smooth[peaks_idx_mins], s = 55,
c = 'black', label = 'Local Min Cusp')
plt.legend(loc='upper left')
plt.show()

#Export to csv
df['Cusp_max']=False
df['Cusp_min']=False
df.loc[df1.x[peaks_idx_max].index, 'Cusp_max']=True
df.loc[df1.x[peaks_idx_mins].index, 'Cusp_min']=True

data=df[df['Cusp_max'] | df['Cusp_min']]
data.to_csv(r'Cusp_total.csv')

#Calculate height difference
my_data=pd.read_csv('Cusp_total.csv', delimiter=',', header=0, names=['ID', 'x', 'y', 'lines'])
df_1 = df ['lines'] == 1
df1 = df[df_1]

df1_diff=pd.DataFrame(my_data)
df1_diff['Diff_Cusps']=df1_diff['y'].diff(-1)

#Only use positive numbers for average
df1_pos = df_diff[df_diff['Diff_Cusps'] > 0]
print("Average Height Difference: ", (df1_pos['Diff_Cusps'].mean()), "m")

理想情况下,脚本会从 .csv 文件中未知数量的样线中选择高程变化最大的样线,然后将其导出到新的 .csv 文件。

最佳答案

您需要按列进行分组

不确定这是否是您所说的海拔变化时的意思,但这给出了每个组的海拔差异(最大(y) - 最小(y)),其中组由共享相同“线”值的所有行组成'每一组代表一个这样的值。这应该可以帮助您解决逻辑中缺少的内容(抱歉无法投入更多时间)。

frame = pd.read_csv('transect4.csv', header=None, names=['x', 'y', 'lines'])
groups = frame.groupby('lines')
groups['y'].max() - groups['y'].min()
# Should give you max elevations of each group.

关于python - 在Python中分析列的高度差并选择最大差值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57769659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com