替换给定索引的数据框中的值

时间:2018-06-18 14:50:50

标签: python python-3.x pandas dataframe

我想从几个列表中为数据框添加值。列表是:

car_list
milage_lists
avg_speeds

和索引列表idx(未排序)。我想用index idx中的所有元素的值替换三个列表中的值。 我试过的是:

    sec_idx = range(len(idx))
    for index, second_index in zip(idx, sec_idx):
        df.at[index,'col1'] = car_list[second_index]
        df.at[index,'col3'] = mileage_lists[second_index]
        df.at[index,'col5'] = avg_speeds[second_index]
然而,这只是冻结。我怎么能这样做?

编辑:这是一个最小的工作示例。

df = pd.DataFrame([[1, 2, 4, 7], [1, 3, 3, 6], [4, 3, 6, 6], [1, 2, 4, 7], [1, 3, 3, 6], [4, 3, 6, 6]], columns=['A', 'B', 'C', 'D'])
idx = [1, 3]

car_values = [344, 626]
gas_values = [12321 , 124124]

for ix in range(2):
    df.at[idx[ix], 'A'] = car_values[ix]
    df.at[idx[ix], 'D'] = gas_values[ix]

问题是大型数据集(60 000行)冻结。

3 个答案:

答案 0 :(得分:1)

这应该可以解决问题(允许您指定列标题):

import pandas as pd

df = pd.DataFrame([[1, 2, 4, 7], [1, 3, 3, 6], [4, 3, 6, 6], [1, 2, 4, 7], [1, 3, 3, 6], [4, 3, 6, 6]], columns=['A', 'B', 'C', 'D'])

indices = [1, 3]
car_values = [344, 626]
gas_values = [12321 , 124124]

for idx, i, j in zip(indices, car_values, gas_values):
    df['A'].iloc[idx] = i
    df['B'].iloc[idx] = j

答案 1 :(得分:0)

如果您有一个带索引的列表

idx_list = [idx1, idx2, idex3] 

以及值为

的列表列表
values_list = [car_list, milage_lists, avg_speeds] 

然后您可以使用以下内容迭代列表,索引将增加列号

column_names= ['A', 'B', 'C']
for idx, list, col in zip(idx_list, values_list, column_names):
    df.iloc[idx,col] = list

索引不需要排序

答案 2 :(得分:0)

尝试使用以下矢量化解决方案:

In [175]: df.loc[idx, ['A','D']] = np.column_stack((car_values, gas_values))

In [176]: df
Out[176]:
     A  B  C       D
0    1  2  4       7
1  344  3  3   12321
2    4  3  6       6
3  626  2  4  124124
4    1  3  3       6
5    4  3  6       6