我有一个CSV文件,它有78列,大约400000。下面是一个简化的示例:''
df=pd.DataFrame({'X':[1,2,3,4],
'Y':[0,0,1,1],
'Z':[0,0,0,0],
'Location':[1,2,3,4],
'Data1':[123,645,324,876]
'Data2':[733,347,547,764]
'Data3':[245,846,435,099]
'Data4':[748,664,222,810]}
''
当尝试为列使用键时,请取消loc-key弃用功能:''
headers=df.keys().tolist()
df=df.reindex(columns=headers)
''
在旋转"Data1"-"Data4"时,我需要为"Location"的每个值生成一个重复X、Y、Z的输出。
看来熔化功能很好,
''
df2=pd.melt(df, id_vars=['X','Y','Z'], value_vars=['Location', 'Data1', 'Data2', 'Data3', 'Data4'], value_name='Measurements')
"在进行数学转换之前,最终得到了我需要的数据格式。''
X Y Z variable Measurements
1 0 0 Data1 123
2 0 0 Data1 645
... (Many Rows Later)
4 1 0 Data4 810
''
现在我需要做这个问题关于的实际数学运算
我如何从Data1-Data48中获得48种类型的变量。无论数据字段是什么,我都需要修改Z字段(我正在为一些地质建模/可视化制作点云(。我能想到的唯一方法是有48个if语句,并在循环中对每个语句求值,并在Z列中添加适当的偏移量。。。
现在,这似乎效率很低,必须有另一种方法,我试着用谷歌搜索来摆脱这一困境,但真的一点运气都没有。
让我们假设您有一个字典将variable
字段映射到偏移量:
delta = {'Data1': 3, 'Data2': 5, 'Data3': 7, 'Data4': 9, 'Location': 0}
我们可以从中构建一个辅助数据帧:
aux = pd.Series(delta, name='offset').to_frame().rename_axis('variable').reset_index()
它在这里给出:
variable offset
0 Data1 3
1 Data2 5
2 Data3 7
3 Data4 9
4 Location 0
我们现在可以简单地以矢量化的方式将相关偏移添加到Z
字段:
df2['Z'] += df2.merge(aux, how='left', on='variable')['offset']
获取:
X Y Z variable Measurements
0 1 0 0 Location 1
1 2 0 0 Location 2
2 3 1 0 Location 3
3 4 1 0 Location 4
4 1 0 3 Data1 123
5 2 0 3 Data1 645
6 3 1 3 Data1 324
7 4 1 3 Data1 876
8 1 0 5 Data2 733
9 2 0 5 Data2 347
10 3 1 5 Data2 547
11 4 1 5 Data2 764
12 1 0 7 Data3 245
13 2 0 7 Data3 846
14 3 1 7 Data3 435
15 4 1 7 Data3 99
16 1 0 9 Data4 748
17 2 0 9 Data4 664
18 3 1 9 Data4 222
19 4 1 9 Data4 810