熊猫会更正列表中的值

时间:2019-03-21 17:21:20

标签: python pandas

我有一个这样的数据框:

data = {"pos":[["A1","A2"],
               ["B1","B2"]],
        "value"  :[[20,1000],
                 [20,50]]}

通过以下方式创建:

df = pd.DataFrame(data)

此数据框:

        pos       value
0  [A1, A2]  [20, 1000]
1  [B1, B2]    [20, 50]

我需要的是将> = 1000的值切成两半,在列表中的整个位置填充两个拆分值,然后在column [“ pos”]中克隆相应的位置。

喜欢:

        pos       value           new_value
0  [A1, A2]  [20, 1000]  [20, 500.0, 500.0]
1  [B1, B2]    [20, 50]            [20, 50]

因此,我创建了此功能:

def splitMax():
    loop_list = df.value.tolist()
    new_list = copy.deepcopy(loop_list)

    for idx, nested_list in enumerate(loop_list):
        for idx_nested, list_el in enumerate(nested_list):
            if list_el >= 1000 and list_el <=2000:

                new_list[idx][idx_nested] = list_el/2
                new_list[idx].insert(idx_nested+1,list_el/2)
    df["new_value"] = new_list

但是现在变得越来越复杂了: 我最后想要的是下面的内容。

   old_pos   old_values        new_pos      new_values
0  [A1, A2]  [20, 1000]   [A1, A2, A2]  [20, 500, 500]
1  [B1, B2]    [20, 50]  [B1, B2, nan]     [20, 50, 0]

我的问题是,当第三行的值为[1000,1000]时,所有已经计算出的行都需要再次进行校正。

在第二行:“ pos_new” = [B1,B2,nan]然后必须成为[B1,B2,nan,nan]。 new_value = [20,50,0,0]

1 个答案:

答案 0 :(得分:1)

我最终分两个步骤提出了解决方案

[编辑]

data = {"pos":[["A1","A2"],
               ["B1","B2"]],
        "value"  :[[20,1000],
                 [20,50]]}

df = pd.DataFrame(data)

limit = 1000

# New (proposed) implementation of your function
def new_row(row):
    row.loc['new_value'] = np.concatenate([(i, ) if i<limit else (i/2, i/2) for i in row[1]]) 
    row.loc['new_pos'] = np.concatenate([(row[0][pos],) if i<limit else (row[0][pos], row[0][pos]) for pos, i in enumerate(row[1])]) 
    return row

df = df.apply(new_row, axis = 1)

# To fix mismatched lengths
max_elements = df['new_value'].apply(len).max()

df['new_value'] = df['new_value'].apply(lambda x: np.append(x, [0] * (max_elements-len(x))))
df['new_pos'] = df['new_pos'].apply(lambda x: np.append(x, [np.nan] * (max_elements-len(x))))

输出

    pos         value       new_value               new_pos
0   [A1, A2]    [20, 1000]  [20.0, 500.0, 500.0]    [A1, A2, A2]
1   [B1, B2]    [20, 50]    [20, 50, 0]             [B1, B2, nan]