我有一个这样的数据框:
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]
答案 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]