Pandas在单列中的多行上迭代..如何避免40+elif语句



我有一个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

最新更新