【问题标题】:Pandas iterating over multiple rows in single columns.... how to avoid 40+ elif statements?Pandas 在单列中迭代多行......如何避免 40 多个 elif 语句?
【发布时间】:2020-06-19 10:23:53
【问题描述】:

我有一个 78 列乘以 400,000 列的 CSV 文件。一个简化的例子如下: '''

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 键弃用的东西: '''

headers=df.keys().tolist()
df=df.reindex(columns=headers)

'''

我需要在旋转“Data1”-“Data4”时为“Location”的每个值生成一个重复 X、Y、Z 的输出。

似乎melt功能对此很有用,

'''

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 种类型的变量。我需要通过 Data 字段来修改 Z 字段(我正在为一些地质建模/可视化制作点云)。我能想到的唯一方法是拥有 48 个 if 语句并在循环中评估每个语句并将适当的偏移量添加到 Z 列...

现在,这似乎效率低下,必须有另一种方法,我试图用谷歌搜索我的方法,但真的一点运气都没有。

【问题讨论】:

  • 使用字典并使用键查找值。

标签: python arrays pandas list


【解决方案1】:

假设您有一个字典,将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

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2016-02-19
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多