我有一个数据集,如下图所示。
Date Lon_s lat_s HLON_cv HLAT_cv
1853-11-09 31 -10.4 293.85 5.2
1853-11-09 302.3 3.6 290.15 4.9
1853-12-01 85.5 -7.5 84.62 -6.88
1853-12-01 85.5 -7.5 78.2 -6.83
1853-12-01 88 -8.6 84.62 -6.88
1853-12-01 88 -8.6 78.2 -6.83
1853-12-01 86.6 -7.8 84.62 -6.88
1853-12-01 86.6 -7.8 78.2 -6.83
对于每一个日期,我想从lon_s中抽取一个元素,并与HLON的所有其他值有差异,例如。对于1853-11-09:lon 31- HLON 293.85 lon 31- HLON 290.15 lon 302.3-HLON 293.85 lon 302.3-HLON 290.15与相应的lat-HLAT也是如此。
我已经使用了for group, values in df.groupby(df['Date']):
到groupby date,但需要帮助的其余部分。
请尝试下面的代码,并让我知道它是否有效。
diff_df = pd.DataFrame()
for group, values in df.groupby(df['Date']):
lat_diff = []; lon_diff = []
for i in range(len(values['Lon_s'])):
for j in range(len(values['HLON_cv']):
lon_diff.append(values['Lon_s'].iloc[i] - values['HLON_cv'].iloc[j])
for m in range(len(values['Lat_s'])):
for n in range(len(values['HLAT_cv']):
lat_diff.append(values['Lat_s'].iloc[m] - values['HLAT_cv'].iloc[n])
df = pd.DataFrame({"date": group, "Lat_Diff": lat_diff, "Long_Diff":lon_diff})
diff_df = diff_df.append(df)
这将为你创建一个格式的数据框。
Date Lon_diff Lat_diff
0 1853-11-09 -262.85 -15.60
1 1853-11-09 -259.15 -15.30
2 1853-12-01 0.88 -0.62
3 1853-12-01 7.30 -0.67
4 1853-12-01 0.88 -0.62
5 1853-12-01 7.30 -0.67
6 1853-12-01 0.88 -0.62
7 1853-12-01 7.30 -0.67
定义下面的函数(里面还有一个函数)。
def myFun(grp):
def myDiff(col1, col2):
return col1.iloc[0] - col2
return pd.DataFrame({'Lon_diff': myDiff(grp.Lon_s, grp.HLON_cv),
'Lat_diff': myDiff(grp.Lat_s, grp.HLAT_cv)})
它将生成一个由2列组成的DataFrame。Lon_diff 和 Lat_diff,每一个都有各自的区别。
然后将此函数的应用结果加入到原DataFrame中。
result = df.join(df.groupby('Date').apply(myFun))
结果是:
Date Lon_s Lat_s HLON_cv HLAT_cv Lon_diff Lat_diff
0 1853-11-09 31.0 -10.4 293.85 5.20 -262.85 -15.60
1 1853-11-09 302.3 3.6 290.15 4.90 -259.15 -15.30
2 1853-12-01 85.5 -7.5 84.62 -6.88 0.88 -0.62
3 1853-12-01 85.5 -7.5 78.20 -6.83 7.30 -0.67
4 1853-12-01 88.0 -8.6 84.62 -6.88 0.88 -0.62
5 1853-12-01 88.0 -8.6 78.20 -6.83 7.30 -0.67
6 1853-12-01 86.6 -7.8 84.62 -6.88 0.88 -0.62
7 1853-12-01 86.6 -7.8 78.20 -6.83 7.30 -0.67